// @generated by ocpp-codegen from schemas/. Do not edit by hand -- run
// `scripts/generate.sh` to regenerate; manual changes will be overwritten.
//! Value sets the specification defines for fields its JSON schemas
//! type as bare strings.
//!
//! A field like `Variable.name` or `SecurityEventNotification.type` is
//! just `{"type": "string", "maxLength": N}` in the schema, with the
//! permitted values listed in a specification appendix instead. Those
//! appendix tables are vendored under `csv/` and generated into this
//! module.
//!
//! Nothing here changes a wire type. OCPP permits vendor-specific
//! values for these fields, so the message structs keep their
//! `heapless::String` fields and these enums sit alongside:
//!
//! # Open and closed value sets
//!
//! The sets a deployment realistically extends -- components,
//! variables, configuration keys -- are *open*: they carry an
//! `Other` variant, so a third-party value survives a
//! deserialize/serialize round trip. Use `from_wire_or_other` to
//! accept any value, `from_wire` to ask whether a value is one the
//! specification defines, and `is_standardized` to tell them apart
//! afterwards. Their equality and hashing compare the wire string,
//! so `Other("X")` and the `X` variant are one value.
//!
//! The rest are *closed*: one byte, `Copy`, and `from_wire`
//! returning `None` is the only outcome for an unrecognized value.
//! An open set is neither `Copy` nor one byte -- it is as wide as
//! the field's `maxLength` -- which is why it is opt-in per set.
//!
//! ```ignore
//! use ocpp_types::v21::common::Variable;
//! use ocpp_types::v21::standard::VariableName;
//!
//! let variable = Variable {
//! name: heapless::String::try_from(VariableName::HeartbeatInterval.as_str()).unwrap(),
//! custom_data: None,
//! instance: None,
//! };
//! ```
/// Returned by `FromStr` for a value the specification doesn't
/// define.
///
/// Not in itself a protocol error: OCPP permits vendor-specific
/// components, variables, configuration keys and security events,
/// so receiving one of those is conformant. Use `from_wire` when an
/// unrecognized value is expected and `Option` reads better than
/// `Result`.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct UnknownValue;
impl core::fmt::Display for UnknownValue {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("not a value defined by this OCPP version's specification")
}
}
impl core::error::Error for UnknownValue {}
/// Returned when a value is longer than the specification's
/// `maxLength` for its field.
///
/// Only an open value set can produce this, and only from
/// `from_wire_or_other`: a value too long for the field is not one the
/// field could have carried, so it is rejected rather than truncated.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ValueTooLong;
impl core::fmt::Display for ValueTooLong {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("longer than this field's maxLength in the specification")
}
}
impl core::error::Error for ValueTooLong {}
/// Standardized `Component.name` values.
///
/// The schema types `Component.name` as a plain string, since a Charging Station may expose vendor-specific components alongside these.
///
/// An *open* set: values the specification doesn't define are carried
/// in [`Self::Other`] rather than rejected, so a deployment's own
/// values survive a deserialize/serialize round trip.
///
/// Comparison and hashing go through the wire string, not the variant,
/// so `Other("...")` holding a standardized value compares equal to
/// that variant.
#[derive(Debug, Clone)]
pub enum ComponentName {
/// Logical Component responsible for configuration relating to the reporting of clock-aligned meter data.
AlignedDataCtrlr,
/// Logical Component responsible for configuration relating to the use of a local cache for authorization for Charging Station use.
AuthCacheCtrlr,
/// Logical Component responsible for configuration relating to the use of authorization for Charging Station use.
AuthCtrlr,
/// A CHAdeMO Controller component communicates with an EV using the wired CANbus protocol to exchange information and control charging using the CHAdeMO protocol
CHAdeMOCtrlr,
/// Provides a means to configure management of time tracking by Charging Station.
ClockCtrlr,
/// Responsible for configuration relating to custom vendor-specific implementations, like the DataTransfer message and CustomData extensions or CustomTriggers.
CustomizationCtrlr,
/// Logical Component responsible for configuration relating to the exchange and storage of Charging Station Device Model data.
DeviceDataCtrlr,
/// Logical Component responsible for configuration relating to the display of messages to Charging Station users.
DisplayMessageCtrlr,
/// Communicates with an EV to exchange information and control charging using the ISO 15118 protocol.
ISO15118Ctrlr,
/// Logical Component responsible for configuration relating to the use of Local Authorization Lists for Charging Station use.
LocalAuthListCtrlr,
/// Logical Component responsible for configuration relating to the exchange of monitoring event data.
MonitoringCtrlr,
/// Logical Component responsible for configuration relating to information exchange between Charging Station and CSMS.
OCPPCommCtrlr,
/// Logical Component responsible for configuration relating to reservations.
ReservationCtrlr,
/// Logical Component responsible for configuration relating to the reporting of sampled meter data.
SampledDataCtrlr,
/// Logical Component responsible for configuration relating to security of communications between Charging Station and CSMS.
SecurityCtrlr,
/// Logical Component responsible for configuration relating to smart charging.
SmartChargingCtrlr,
/// Logical Component responsible for configuration relating to tariff and cost display.
TariffCostCtrlr,
/// Logical Component responsible for configuration relating to transaction characteristics and behaviour.
TxCtrlr,
/// Allows physical access of vehicles to a charging site to be controlled.
AccessBarrier,
/// Provides a variable DC current source to force energy directly into an EV battery stack, under tight control of the EV's battery management system.
AcDcConverter,
/// Allows a specific AC phase to be selected (typically at EVSE tier) for single phase vehicle charging in order to lower overall (e.g. site) phase imbalance.
AcPhaseSelector,
/// A general purpose electro-mechanical output system, with optional completion tracking sensing. Each output should use a Variable instance key indicating the nature of the output.
Actuator,
/// Fans (or equivalent devices) used to provide cooling.
AirCoolingSystem,
/// Fans (or equivalent devices) used to ensure that EVs that require ventilation during charging
AreaVentilation,
/// Sensor (optical, ground loop, ultrasonic, etc.) to detect whether the associated parking/charging bay is physically vacant, or is occupied by a vehicle or other obstruction
BayOccupancySensor,
/// Beacon Lighting to help EV drivers to locate nearby charging places, and/or to determine charging availability state, usually by color variation.
BeaconLighting,
/// A sensor that detects when a charging cable (captive or removable) has been forcibly pulled from the Charging Station.
CableBreakawaySensor,
/// Reports when an access door/panel is open
CaseAccessSensor,
/// The entire Charging Station as a logical entity
ChargingStation,
/// The Charging Status Indicator, provides visible feedback to the user about the connection and charging status of an EVSE/Connector. This is commonly in the form of multi-colored lighting.
ChargingStatusIndicator,
/// ConnectedEV is a component that represents a connected vehicle for which data is received via an ISO 15118 or CHAdeMO interface. The generic information that is received, is represented as variables of ConnectedEV. Any protocol-specific information is represented in variables of the ISO15118Ctrlr or CHAdeMOCtrlr component.
ConnectedEV,
/// A means to connect an EV to a Charging Station with either a socket, an attached cable & inline connector, or any wireless power transfer device.
Connector,
/// A mechanism present in a connector holster to prevent the connector from being removed inappropriately: typically unlocks connector after authorization.
ConnectorHolsterRelease,
/// A mechanism to report when a tethered cable connector has been removed from its normal stowage position. May be used for detection of connectors left un-holstered, and possible penalty billing.
ConnectorHolsterSensor,
/// Locking mechanism to retain an inserted plug, both to prevent on-load disconnection, and to prevent theft of charging cables
ConnectorPlugRetentionLock,
/// External protective mechanism (e.g. an external shutter or a connector holster lock mechanism) to prevent contact with conductors that may become 'live' under other failure modes
ConnectorProtectionRelease,
/// An embedded logic controller
Controller,
/// Energy, Power, Electricity meter, used to measure energy, current, voltages etc.
ControlMetering,
/// Control Pilot PWM Controller: provides and senses the IEC 61851-1 / SAE J1772 low voltage DC and PWM signalling between an EVSE and EV over a control pilot line.
CPPWMController,
/// Provides a communications link from a Charging Station to a CSMS. It may use fixed infrastructure, mobile telephony data services, WiFi, or other connectivity channels.
DataLink,
/// Provides information and feedback to the user.
Display,
/// Defines the Distribution Panel, with it's fuses and connections to both Charging Stations and other Distribution Panel's.
DistributionPanel,
/// Represents an incoming electrical connection to a Charging Station, that may be a grid/distribution network connection, of a connection to local power generation and/or storage. Each electrical feed can record the electrical and other characteristics of that feed, including power rating, fusing, upstream metering, etc. When a Charging Station has more than one electrical feed, it must represent which feed supplies each EVSE, and which feed supplies the house load of the Charging Station itself. Simple Charging Stations with only a single electrical feed may omit all electrical feed information, in which case it is inferred that all power is supplied from a single feed, and what would otherwise be ElectricalFeed data (Variables) may be reported as being associated with the ChargingStation component.
ElectricalFeed,
/// Represents the low voltage power supply (typically 12V DC and often other ELV voltages) that provides operating power for controllers, relays, and other electrical components.
ELVSupply,
/// An 'Emergency Stop' button that should be pressed by the user or other nearby persons if serious faulty behavior is observed (e.g. smoke/flames from EV or Charging Station).
EmergencyStopSensor,
/// Provides reporting/control of general illumination lighting in use at Charging Station.
EnvironmentalLighting,
/// A locking mechanism on the EV side as a safety measure to prevent it being disconnected while high currents are flowing.
EVRetentionLock,
/// The entire chain of components responsible for transporting energy from the incoming supply to the electric vehicle (or vice versa)
EVSE,
/// Reports ambient air temperature
ExternalTemperatureSensor,
/// Provides energy transfer readings that are the basis for billing.
FiscalMetering,
/// A sensor reporting whether the Charging Station is experiencing water ingress/pooling.
FloodSensor,
/// An Isolation Tester as part of their own self-test mechanisms, to confirm the isolation of floating circuitry when no Evs are connected
GroundIsolationProtection,
/// Heater to ensure reliable operation in cold environments
Heater,
/// Reports relative air humidity
HumiditySensor,
/// Reports ambient light levels.
LightSensor,
/// A liquid based cooling system, typically used to cool the connector cables of very high power Charging Stations.
LiquidCoolingSystem,
/// Accepts local signal inputs controlling whether new Charging Sessions can start and/or whether ongoing sessions should continue. Typically connected to a site/building power supply, to automatically report unavailability when closed.
LocalAvailabilitySensor,
/// The entire Local Controller as a logical entity
LocalController,
/// Energy storage
LocalEnergyStorage,
/// The instances of component NetworkConfiguration represent network connection configurations.
NetworkConfiguration,
/// Protects equipment by disconnecting the electrical supply when the current drawn (on any phase) exceeds the rated value to a substantial degree.
OverCurrentProtection,
/// Recloser mechanism of an OverCurrentProtection to perform re-arm retries after a trip, or may be set for remotely controlled re-arming on command.
OverCurrentProtectionRecloser,
/// Switches on and off the power to the EV after all authorization and safety requirements have been met. May have secondary contacts to report closure state.
PowerContactor,
/// A Residual Current Device (US: ground fault breaker) protects human life and/or downstream equipment by quickly detecting abnormal current flows (usually indicative in earth faults) in the Charging Station, cable, or EV during charging.
RCD,
/// A motorized recloser mechanism of an RCD that may be configured to perform re-arm retries after a trip, or may be set for remotely controlled re-arming on command.
RCDRecloser,
/// Represents realtime clock hardware that can maintain accurate date & time information in a Charging Station, even in the case of simultaneous CSMS uncontactability and power outages or resets.
RealTimeClock,
/// Measures impact forces/accelerations experienced, indicative of possible damage.
ShockSensor,
/// Electronic signage allowing a charging controller for a large charging facility to advertise counts of available spaces to passing traffic.
SpacesCountSignage,
/// A general purpose electromechanical input device, with optional remote defaulting/resetting of values. Each input should use a Variable instance key indicating the nature of the input.
Switch,
/// Temperature sensor at a point inside the Charging Station, multiple sensing points for a single sensing controller. Multiple sensing points for a single sensing controller may be reported using distinct Variable instance keys.
TemperatureSensor,
/// Measures Tilt angle from normal reference position (normally 90 degree vertical).
TiltSensor,
/// An authorization token reader (e.g. RFID)
TokenReader,
/// Circuitry designed to trigger the disconnection of power to the structure by an upstream protection device after a severe problem has been detected
UpstreamProtectionTrigger,
/// A logical input mechanism (e.g. set of buttons) that is part of a UI whose use may be communicated to the CSMS (in near real time). May support momentary inputs ('Operated') or modal state ('Active'). Multiple input sources should use explicit Variable instance keys (where the input function is key name).
UIInput,
/// Reports an identifier associated with a vehicle occupying a charging bay. The identifier may be a vehicle registration number via ANPR hardware, a VIN, or other local identifier of the vehicle based on medium range/active RFID, or any other relevant technology and result.
VehicleIdSensor,
/// Listed in the specification's device model table but not in its dedicated name table.
FrequencySimulator,
/// Listed in the specification's device model table but not in its dedicated name table.
DataCollector,
/** A value this version's specification doesn't define -- typically a
vendor-specific one, which OCPP explicitly permits.
Bounded at 50 bytes, the same `maxLength` the wire field carries,
so anything the field can hold this can hold. Prefer
[`Self::from_wire_or_other`] over constructing this directly: it
returns the standardized variant when the value is one, keeping a
single representation per wire string.*/
Other(heapless::String<50usize>),
}
impl ComponentName {
/// Every value this version's specification defines (77), in spec order.
///
/// Does not include [`Self::Other`], which is unbounded in the
/// values it can hold.
pub const ALL: &'static [Self] = &[
Self::AlignedDataCtrlr,
Self::AuthCacheCtrlr,
Self::AuthCtrlr,
Self::CHAdeMOCtrlr,
Self::ClockCtrlr,
Self::CustomizationCtrlr,
Self::DeviceDataCtrlr,
Self::DisplayMessageCtrlr,
Self::ISO15118Ctrlr,
Self::LocalAuthListCtrlr,
Self::MonitoringCtrlr,
Self::OCPPCommCtrlr,
Self::ReservationCtrlr,
Self::SampledDataCtrlr,
Self::SecurityCtrlr,
Self::SmartChargingCtrlr,
Self::TariffCostCtrlr,
Self::TxCtrlr,
Self::AccessBarrier,
Self::AcDcConverter,
Self::AcPhaseSelector,
Self::Actuator,
Self::AirCoolingSystem,
Self::AreaVentilation,
Self::BayOccupancySensor,
Self::BeaconLighting,
Self::CableBreakawaySensor,
Self::CaseAccessSensor,
Self::ChargingStation,
Self::ChargingStatusIndicator,
Self::ConnectedEV,
Self::Connector,
Self::ConnectorHolsterRelease,
Self::ConnectorHolsterSensor,
Self::ConnectorPlugRetentionLock,
Self::ConnectorProtectionRelease,
Self::Controller,
Self::ControlMetering,
Self::CPPWMController,
Self::DataLink,
Self::Display,
Self::DistributionPanel,
Self::ElectricalFeed,
Self::ELVSupply,
Self::EmergencyStopSensor,
Self::EnvironmentalLighting,
Self::EVRetentionLock,
Self::EVSE,
Self::ExternalTemperatureSensor,
Self::FiscalMetering,
Self::FloodSensor,
Self::GroundIsolationProtection,
Self::Heater,
Self::HumiditySensor,
Self::LightSensor,
Self::LiquidCoolingSystem,
Self::LocalAvailabilitySensor,
Self::LocalController,
Self::LocalEnergyStorage,
Self::NetworkConfiguration,
Self::OverCurrentProtection,
Self::OverCurrentProtectionRecloser,
Self::PowerContactor,
Self::RCD,
Self::RCDRecloser,
Self::RealTimeClock,
Self::ShockSensor,
Self::SpacesCountSignage,
Self::Switch,
Self::TemperatureSensor,
Self::TiltSensor,
Self::TokenReader,
Self::UpstreamProtectionTrigger,
Self::UIInput,
Self::VehicleIdSensor,
Self::FrequencySimulator,
Self::DataCollector,
];
/// This value as it appears on the wire.
pub fn as_str(&self) -> &str {
match self {
Self::AlignedDataCtrlr => "AlignedDataCtrlr",
Self::AuthCacheCtrlr => "AuthCacheCtrlr",
Self::AuthCtrlr => "AuthCtrlr",
Self::CHAdeMOCtrlr => "CHAdeMOCtrlr",
Self::ClockCtrlr => "ClockCtrlr",
Self::CustomizationCtrlr => "CustomizationCtrlr",
Self::DeviceDataCtrlr => "DeviceDataCtrlr",
Self::DisplayMessageCtrlr => "DisplayMessageCtrlr",
Self::ISO15118Ctrlr => "ISO15118Ctrlr",
Self::LocalAuthListCtrlr => "LocalAuthListCtrlr",
Self::MonitoringCtrlr => "MonitoringCtrlr",
Self::OCPPCommCtrlr => "OCPPCommCtrlr",
Self::ReservationCtrlr => "ReservationCtrlr",
Self::SampledDataCtrlr => "SampledDataCtrlr",
Self::SecurityCtrlr => "SecurityCtrlr",
Self::SmartChargingCtrlr => "SmartChargingCtrlr",
Self::TariffCostCtrlr => "TariffCostCtrlr",
Self::TxCtrlr => "TxCtrlr",
Self::AccessBarrier => "AccessBarrier",
Self::AcDcConverter => "AcDcConverter",
Self::AcPhaseSelector => "AcPhaseSelector",
Self::Actuator => "Actuator",
Self::AirCoolingSystem => "AirCoolingSystem",
Self::AreaVentilation => "AreaVentilation",
Self::BayOccupancySensor => "BayOccupancySensor",
Self::BeaconLighting => "BeaconLighting",
Self::CableBreakawaySensor => "CableBreakawaySensor",
Self::CaseAccessSensor => "CaseAccessSensor",
Self::ChargingStation => "ChargingStation",
Self::ChargingStatusIndicator => "ChargingStatusIndicator",
Self::ConnectedEV => "ConnectedEV",
Self::Connector => "Connector",
Self::ConnectorHolsterRelease => "ConnectorHolsterRelease",
Self::ConnectorHolsterSensor => "ConnectorHolsterSensor",
Self::ConnectorPlugRetentionLock => "ConnectorPlugRetentionLock",
Self::ConnectorProtectionRelease => "ConnectorProtectionRelease",
Self::Controller => "Controller",
Self::ControlMetering => "ControlMetering",
Self::CPPWMController => "CPPWMController",
Self::DataLink => "DataLink",
Self::Display => "Display",
Self::DistributionPanel => "DistributionPanel",
Self::ElectricalFeed => "ElectricalFeed",
Self::ELVSupply => "ELVSupply",
Self::EmergencyStopSensor => "EmergencyStopSensor",
Self::EnvironmentalLighting => "EnvironmentalLighting",
Self::EVRetentionLock => "EVRetentionLock",
Self::EVSE => "EVSE",
Self::ExternalTemperatureSensor => "ExternalTemperatureSensor",
Self::FiscalMetering => "FiscalMetering",
Self::FloodSensor => "FloodSensor",
Self::GroundIsolationProtection => "GroundIsolationProtection",
Self::Heater => "Heater",
Self::HumiditySensor => "HumiditySensor",
Self::LightSensor => "LightSensor",
Self::LiquidCoolingSystem => "LiquidCoolingSystem",
Self::LocalAvailabilitySensor => "LocalAvailabilitySensor",
Self::LocalController => "LocalController",
Self::LocalEnergyStorage => "LocalEnergyStorage",
Self::NetworkConfiguration => "NetworkConfiguration",
Self::OverCurrentProtection => "OverCurrentProtection",
Self::OverCurrentProtectionRecloser => "OverCurrentProtectionRecloser",
Self::PowerContactor => "PowerContactor",
Self::RCD => "RCD",
Self::RCDRecloser => "RCDRecloser",
Self::RealTimeClock => "RealTimeClock",
Self::ShockSensor => "ShockSensor",
Self::SpacesCountSignage => "SpacesCountSignage",
Self::Switch => "Switch",
Self::TemperatureSensor => "TemperatureSensor",
Self::TiltSensor => "TiltSensor",
Self::TokenReader => "TokenReader",
Self::UpstreamProtectionTrigger => "UpstreamProtectionTrigger",
Self::UIInput => "UIInput",
Self::VehicleIdSensor => "VehicleIdSensor",
Self::FrequencySimulator => "FrequencySimulator",
Self::DataCollector => "DataCollector",
Self::Other(value) => value.as_str(),
}
}
/// Parses a wire value, returning `None` for values the
/// specification doesn't define.
///
/// Use this to ask "is this one of the spec's values?". To accept
/// any value, use [`Self::from_wire_or_other`].
pub fn from_wire(value: &str) -> Option<Self> {
match value {
"AlignedDataCtrlr" => Some(Self::AlignedDataCtrlr),
"AuthCacheCtrlr" => Some(Self::AuthCacheCtrlr),
"AuthCtrlr" => Some(Self::AuthCtrlr),
"CHAdeMOCtrlr" => Some(Self::CHAdeMOCtrlr),
"ClockCtrlr" => Some(Self::ClockCtrlr),
"CustomizationCtrlr" => Some(Self::CustomizationCtrlr),
"DeviceDataCtrlr" => Some(Self::DeviceDataCtrlr),
"DisplayMessageCtrlr" => Some(Self::DisplayMessageCtrlr),
"ISO15118Ctrlr" => Some(Self::ISO15118Ctrlr),
"LocalAuthListCtrlr" => Some(Self::LocalAuthListCtrlr),
"MonitoringCtrlr" => Some(Self::MonitoringCtrlr),
"OCPPCommCtrlr" => Some(Self::OCPPCommCtrlr),
"ReservationCtrlr" => Some(Self::ReservationCtrlr),
"SampledDataCtrlr" => Some(Self::SampledDataCtrlr),
"SecurityCtrlr" => Some(Self::SecurityCtrlr),
"SmartChargingCtrlr" => Some(Self::SmartChargingCtrlr),
"TariffCostCtrlr" => Some(Self::TariffCostCtrlr),
"TxCtrlr" => Some(Self::TxCtrlr),
"AccessBarrier" => Some(Self::AccessBarrier),
"AcDcConverter" => Some(Self::AcDcConverter),
"AcPhaseSelector" => Some(Self::AcPhaseSelector),
"Actuator" => Some(Self::Actuator),
"AirCoolingSystem" => Some(Self::AirCoolingSystem),
"AreaVentilation" => Some(Self::AreaVentilation),
"BayOccupancySensor" => Some(Self::BayOccupancySensor),
"BeaconLighting" => Some(Self::BeaconLighting),
"CableBreakawaySensor" => Some(Self::CableBreakawaySensor),
"CaseAccessSensor" => Some(Self::CaseAccessSensor),
"ChargingStation" => Some(Self::ChargingStation),
"ChargingStatusIndicator" => Some(Self::ChargingStatusIndicator),
"ConnectedEV" => Some(Self::ConnectedEV),
"Connector" => Some(Self::Connector),
"ConnectorHolsterRelease" => Some(Self::ConnectorHolsterRelease),
"ConnectorHolsterSensor" => Some(Self::ConnectorHolsterSensor),
"ConnectorPlugRetentionLock" => Some(Self::ConnectorPlugRetentionLock),
"ConnectorProtectionRelease" => Some(Self::ConnectorProtectionRelease),
"Controller" => Some(Self::Controller),
"ControlMetering" => Some(Self::ControlMetering),
"CPPWMController" => Some(Self::CPPWMController),
"DataLink" => Some(Self::DataLink),
"Display" => Some(Self::Display),
"DistributionPanel" => Some(Self::DistributionPanel),
"ElectricalFeed" => Some(Self::ElectricalFeed),
"ELVSupply" => Some(Self::ELVSupply),
"EmergencyStopSensor" => Some(Self::EmergencyStopSensor),
"EnvironmentalLighting" => Some(Self::EnvironmentalLighting),
"EVRetentionLock" => Some(Self::EVRetentionLock),
"EVSE" => Some(Self::EVSE),
"ExternalTemperatureSensor" => Some(Self::ExternalTemperatureSensor),
"FiscalMetering" => Some(Self::FiscalMetering),
"FloodSensor" => Some(Self::FloodSensor),
"GroundIsolationProtection" => Some(Self::GroundIsolationProtection),
"Heater" => Some(Self::Heater),
"HumiditySensor" => Some(Self::HumiditySensor),
"LightSensor" => Some(Self::LightSensor),
"LiquidCoolingSystem" => Some(Self::LiquidCoolingSystem),
"LocalAvailabilitySensor" => Some(Self::LocalAvailabilitySensor),
"LocalController" => Some(Self::LocalController),
"LocalEnergyStorage" => Some(Self::LocalEnergyStorage),
"NetworkConfiguration" => Some(Self::NetworkConfiguration),
"OverCurrentProtection" => Some(Self::OverCurrentProtection),
"OverCurrentProtectionRecloser" => Some(Self::OverCurrentProtectionRecloser),
"PowerContactor" => Some(Self::PowerContactor),
"RCD" => Some(Self::RCD),
"RCDRecloser" => Some(Self::RCDRecloser),
"RealTimeClock" => Some(Self::RealTimeClock),
"ShockSensor" => Some(Self::ShockSensor),
"SpacesCountSignage" => Some(Self::SpacesCountSignage),
"Switch" => Some(Self::Switch),
"TemperatureSensor" => Some(Self::TemperatureSensor),
"TiltSensor" => Some(Self::TiltSensor),
"TokenReader" => Some(Self::TokenReader),
"UpstreamProtectionTrigger" => Some(Self::UpstreamProtectionTrigger),
"UIInput" => Some(Self::UIInput),
"VehicleIdSensor" => Some(Self::VehicleIdSensor),
"FrequencySimulator" => Some(Self::FrequencySimulator),
"DataCollector" => Some(Self::DataCollector),
_ => None,
}
}
/// Parses any wire value, falling back to [`Self::Other`].
///
/// Fails only if `value` is longer than the specification's
/// `maxLength` for this field, in which case it isn't a value the
/// field could have carried in the first place.
pub fn from_wire_or_other(value: &str) -> Result<Self, ValueTooLong> {
if let Some(standardized) = Self::from_wire(value) {
return Ok(standardized);
}
heapless::String::try_from(value).map(Self::Other).map_err(|_| ValueTooLong)
}
/// Whether this is one of the values the specification defines,
/// as opposed to a vendor's own.
pub fn is_standardized(&self) -> bool {
!matches!(self, Self::Other(_))
}
}
impl core::fmt::Display for ComponentName {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl core::str::FromStr for ComponentName {
type Err = ValueTooLong;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_wire_or_other(value)
}
}
impl PartialEq for ComponentName {
fn eq(&self, other: &Self) -> bool {
self.as_str() == other.as_str()
}
}
impl Eq for ComponentName {}
impl core::hash::Hash for ComponentName {
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
self.as_str().hash(state);
}
}
impl PartialOrd for ComponentName {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for ComponentName {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
self.as_str().cmp(other.as_str())
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for ComponentName {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for ComponentName {
fn deserialize<D: serde::Deserializer<'de>>(
deserializer: D,
) -> Result<Self, D::Error> {
struct Visitor;
impl<'v> serde::de::Visitor<'v> for Visitor {
type Value = ComponentName;
fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("a ComponentName string")
}
fn visit_str<E: serde::de::Error>(
self,
value: &str,
) -> Result<Self::Value, E> {
ComponentName::from_wire_or_other(value)
.map_err(serde::de::Error::custom)
}
}
deserializer.deserialize_str(Visitor)
}
}
/// Standardized `Variable.name` values.
///
/// The schema types `Variable.name` as a plain string, since a Charging Station may expose vendor-specific variables alongside these.
///
/// An *open* set: values the specification doesn't define are carried
/// in [`Self::Other`] rather than rejected, so a deployment's own
/// values survive a deserialize/serialize round trip.
///
/// Comparison and hashing go through the wire string, not the variant,
/// so `Other("...")` holding a standardized value compares equal to
/// that variant.
#[derive(Debug, Clone)]
pub enum VariableName {
/// RMS AC Current (in amperes). For 3-phase circuits, each phase (and optional neutral) is represented by a Variable instance equal to a value of the PhaseEnumType (e.g. L1,N). Unkeyed values reported for a Component declared to be multi-phase are assumed to be an average of all per-phase readings and written values are common per-phase settings. Example(s): ChargingStation: Total AC current consumption (all EVSE’s, ancillaries), EVSE: Total current consumed by EVSE: includes losses (AC-\>DC) and EVSE specific ancillaries (e.g. fans), ElectricalFeed: Inflow AC current on feed
ACCurrent,
/// If defined and true, this EVSE supports the selection of which phase to use for 1 phase AC charging.
ACPhaseSwitchingSupported,
/// RMS AC Voltage (in volts). For 3-phase circuits, each phase (and optional neutral) is represented by a Variable instance equal to a value of the PhaseEnumType (e.g. L1,N). Unkeyed values reported for a Component declared to be multi-phase are assumed to be an average ofall per-phase readings and written values are common per-phase settings. Example(s): ElectricalFeed: Input Voltage
ACVoltage,
/// Component is in its non-resting / active state: e.g: On, Engaged, Locked. Some Components may have secondary functions that have corresponding Active Variables with an explicit Variable instance., Note: Monitoring of changes in the Active state of any Component can be specified by setting Delta monitoring on the boolean value with a delta values of 1. Setting/clearing an Active Variable activates/stops the associated functionality, where remotely controllable. Only components that are Available and Enabled can be in the Active state.
Active,
/// Shows the currently used MonitoringBase.
ActiveMonitoringBase,
/// Shows the currently use MonitoringLevel.
ActiveMonitoringLevel,
/// Indicates the configuration profile the station uses to connect to the network.
ActiveNetworkProfile,
/// Active transaction on charging station or EVSE.
ActiveTransactionId,
/// Maximum number of _additionalInfo_ items that can be sent in one message.
AdditionalInfoItemsPerMessage,
/// When set to true, only one certificate (plus a temporarily fallback certificate) of certificateType CSMSRootCertificate is allowed to be installed at a time.
AdditionalRootCertificateCheck,
/// This variable defines whether energy transfer is allowed to be resumed when the transaction is resumed after a reset or power outage.
AllowEnergyTransferResumption,
/// Indicates whether new sessions can be started on EVSEs, while Charging Station is waiting for all EVSEs to become Available in order to start a pending firmware update.
AllowNewSessionsPendingFirmwareUpdate,
/// Component can be reset. Can be used to announce that an EVSE can be reset individually.
AllowReset,
/// If this variable is implemented and set to _true_, then the Charging Station allows downgrading the security profile from 3 to 2.
AllowSecurityProfileDowngrade,
/// Angle(s) relative to normal/design idle position. Multiple Variable instance values may be used to indicate angular position in multiple axes (e.g. Left-Right, Forward-Back).
Angle,
/// Number of attempts (INCLUDING the original attempt) in the last successful or attempted, cycle of operation. Applies typically to self-monitoring motorized electro-mechanical equipment, etc. {Null}: Unknown, 0: Not Attempted/Not allowed, 1: Single attempt/No retries \[allowed\], 2-N: \[up to\] N tries \[allowed\]
Attempts,
/// Whether a remote request to start a transaction in the form of RequestStartTransactionRequest message should be authorized beforehand like a local action to start a transaction.
AuthorizeRemoteStart,
/// A value of ConnectorStatusEnumType (See part 2): replicates ConnectorStatus values reported in StatusNotification messages.
AvailabilityState,
/// The Component exists and is locally configured/wired for use, but might not be (remotely) Enabled.
Available,
/// The basic authentication password is used for HTTP Basic Authentication.
BasicAuthPassword,
/// Message Size (in bytes) - puts constraint on GetReportRequest, GetMonitoringReportRequest or GetVariableRequest message size.
BytesPerMessage,
/// If this variable exists and has the value _true_, then Charging Station can provide a contract certificate that it cannot validate, to the CSMS for validation as part of the AuthorizeRequest.
CentralContractValidationAllowed,
/// This variable can be used to configure the amount of times the Charging Station SHALL double the previous back-off time, starting with the number of seconds configured at CertSigningWaitMinimum, every time the back-off time expires without having received the CertificateSignedRequest containing the from the CSR generated signed certificate.
CertSigningRepeatTimes,
/// This configuration variable defines how long the Charging Station has to wait before generating another CSR, in the case the CSMS accepts the SignCertificateRequest, but never returns the signed certificate.
CertSigningWaitMinimum,
/// Digital Certificate (in Base64 encoding)
Certificate,
/// Amount of Certificates currently installed on the Charging Station.
CertificateEntries,
/// When present, this variable tells CSMS whether Charging Station uses OCSP or CRL to check for revoked certificates.
CertificateStatusSource,
/// The Charging Control Protocol applicable to a Connector. CHAdeMO: CHAdeMO protocol, ISO15118: ISO15118 V2G protocol (wired or wireless) as used with CCS, CPPWM: IEC61851-1 / SAE J1772 protocol (ELV DC & PWM signalling via Control Pilot wire), Uncontrolled: No charging power management applies (e.g. Schuko socket), Undetermined: Yet to be determined (e.g. before plugged in), Unknown: Not determinable, NOTE: ChargeProtocol is distinct from and orthogonal to connectorType.
ChargeProtocol,
/// Charging up to StateOfChargeBulk has completed.
ChargingCompleteBulk,
/// Charging up to StateOfCharge.maxSet has completed.
ChargingCompleteFull,
/// If an instance of this variable is true, then charging profiles with the _chargingProfilePurpose_ mentioned in the *variableInstance* are persistent, i.e. they are stored persistently and will still exist after a reboot.
ChargingProfilePersistence,
/// This variable reports the current transaction charging state for an EVSE.
ChargingState,
/// Time from earliest to latest substantive energy transfer
ChargingTime,
/// Standard 24 bit hexadecimal RGB values. Reg Green Blue color intensity, expressed as standard 24 bit hexadecimal RGB values: 3 00-FF (0-255), in order RRGGBB). E.g. 000000: Black, FF0000: Red, 00FF00: Green, 0000FF: Blue, FFFF00:Yellow, FFFFFF: White, 008000: Medium intensity green.
Color,
/// Points to a communication parent component (data flow source), to allow rendering the communication hierarchy in a UI.
CommunicationParent,
/// Component’s operation cycle has completed. Used only in event notifications, where it is always true.
Complete,
/// If set to true the Charging Station supports tariffs with conditions.
ConditionsSupported,
/// This Configuration Variable can be used to limit the following fields: SetVariableData.attributeValue and VariableCharacteristics.valuesList.
ConfigurationValueSize,
/// Time since logical connection established
ConnectedTime,
/// A value of ConnectorStringEnumType (See Appendix 7). Specific type of connector, including sub-variant information. Note: Distinct and orthogonal to Charging Protocol, Power Type, Phases.
ConnectorType,
/// If this variable is _true_, then ISO 15118 contract certificate installation/update as described by use case M01 - Certificate installation EV
ContractCertificateInstallationEnabled,
/// If this variable is _true_, then Charging Station will try to validate a contract certificate when it is offline.
ContractValidationOffline,
/// General purpose integer count variable for Component state reporting
Count,
/// The countryName of the SECC in the ISO 3166-1 format.
CountryName,
/// Currency in a ISO 4217 formatted currency code.
Currency,
/// Percentage current imbalance in an AC three phase supply.
CurrentImbalance,
/// This standard configuration variable is used to enable/disable the custom implementation named in the *variableInstance*.
CustomImplementationEnabled,
/// This variable defines the names of custom triggers that Charging Station supports in a _customTrigger_ field of TriggerMessageRequest.
CustomTriggers,
/// DC Current (in amperes). May be an instantaneous measurement, or a period average, depending on context/equipment.
DCCurrent,
/// When DCInputPhaseControl is true, then the values of _numberPhases_ and _PhaseToUse_ in a ChargingSchedulePeriodType will select the input phases from the grid to be used by the DC EVSE.
DCInputPhaseControl,
/// DC Voltage (volts). May be an instantaneous measurement, or a period average, depending on context/equipment.
DCVoltage,
/// Text associated with a Component, e.g. a Display.
DataText,
/// Point in time value, in \[RFC3339\] datetime format. Time zone optional.
DateTime,
/// Time in \[RFC3339\] datetime format, when an EV intends to leave the charging station.
DepartureTime,
/// When set to _true_ this variable disables the behavior to request authorization for an
DisablePostAuthorize,
/// When set to _true_ this instructs the Charging Station to not issue any AuthorizationRequests, but only use Authorization Cache and Local Authorization List to determine validity of idTokens.
DisableRemoteAuthorization,
/// Maximum number of different messages that can configured in this Charging Station simultaneous, via SetDisplayMessageRequest.
DisplayMessages,
/// Production series variants reflecting internal design changes or sub-component substitutions not affecting external functionality.
ECVariant,
/// Interval from between 'starting' of a transaction until incipient transaction is automatically canceled, due to failure of EV driver to (correctly) insert the charging cable connector(s) into the appropriate socket(s).
EVConnectionTimeOut,
/// Points to a electrical parent component (energy flow source), to allow rendering the electrical hierarchy in a UI.
ElectricalParent,
/// The Component is Enabled for operation. For Available components that cannot be selectively (remotely) enabled / disabled, this value is always true. Note: Available cannot be false of Enabled is true, so during inventory reporting, Enabled=1 also logically states Available=true
Enabled,
/// Energy quantity (in Wh) for reporting/configuring values related to stored energy (i.e. not transferred energy).
Energy,
/// Energy capacity in Wh of an energy storage device.
EnergyCapacity,
/// Total energy transferred: e.g. from EV during (ongoing or terminated) charging session (in wH by default)
EnergyExport,
/// Cumulative export kWh register value, such as from a (certified) fiscal energy meter.
EnergyExportRegister,
/// Total energy transferred.
EnergyImport,
/// Cumulative export kWh register value, such as from a (certified) fiscal energy meter.
EnergyImportRegister,
/// General purpose variable for reporting/managing numbers of entries in repetitive data structures. maxLimit characteristic reports maximum possible entries.
Entries,
/// Date/time when the configuration was changed externally, i.e. outside of CSMS, for example by a local service action.
ExternalConfigChangeDate,
/// Indicates whether a Charging Station allows an external system to submit a `ChargingStationExternalConstraints` charging profile.
ExternalConstraintsProfileDisallowed,
/// Indicates whether a Charging Station is able to respond to external control signals that influence charging. If the variable is true, but CSMS has set \<\<configkey-external-constraints-profile-disallowed\>\> = true, then external control signals are only allowed during a charging profile with a _chargingProfilePeriod_ = `ExternalLimits` or `ExternalSetpoint`.
ExternalControlSignalsEnabled,
/// Component is operating in a fallback, or backup mode. In inventory reports, a Value of 1 for the maxLimit characteristic indicates that the component can enter a fallback state (i.e. a fallback mode is present).
Fallback,
/// Fan Speed (in RPM). A value of 0 represents stopped/stalled. An empty value indicates that fan speed cannot be read.
FanSpeed,
/// This variable is used to report the length of \<field\> in \<message\> when it is larger
FieldLength,
/// List of supported file transfer protocols.
FileTransferProtocols,
/// Version number of firmware.
FirmwareVersion,
/// Reports (impact) force/ acceleration values (estimates) in one or more directions, in units of Newtons or “g”. Multiple force readings in different (orthogonal) dimensions may be reported using Variable instance values, such as Down, Right, Forward.
Force,
/// List of message formats supported by this Charging Station. Possible values: ASCII, HTML, URI, UTF-8.
Formats,
/// Frequency of AC power, signal, or component operation.
Frequency,
/// A JSON-formatted string with an array of { _time, freq_ } pairs, in which _time_ is
FrequencySchedule,
/// Current rating of a fuse/breaker. Variable instances keyed by phase identifier (L1/L2/L3/N).
FuseRating,
/// Interval of inactivity (no OCPP exchanges) with CSMS after which the Charging Station should send HeartbeatRequest.
HeartbeatInterval,
/// Height above(+)/below(-) reference level (ground level unless context demands otherwise).
Height,
/// The relative humidity in %.
Humidity,
/// Specifies the width of a 'dead band' (as a percentage of the threshold) around the central value of a threshold setting (e.g. MinSet, MaxSet, monitor thresholds) to avoid repeated triggering when the measured quantity lies close to the threshold and is subject to small variations.
Hysteresis,
/// ICCID (Integrated Circuit Card IDentifier) of mobile data SIM card.
ICCID,
/// IMSI (International Mobile Subscriber Identity) number of mobile data SIM card
IMSI,
/// EVSE ID in string format as used in ISO 15118 and IEC 63119-2
ISO15118EvseId,
/// The IdToken used to authorize a charging transaction.
IdToken,
/// The Charging Station identity.
Identity,
/// Impedance: Primary value is real (resistive only) impedance. Where a complex impedance is to be reported, the imaginary part (reactance) must be represented with a separate Variable instance value of 'reactance'. Reactance values are expressed at the (nominal) relevant operating frequency of the Component (e.g. 50/60Hz for mains electricity feed).
Impedance,
/// Minimum Interval (in seconds) between (attempted) operations.
Interval,
/// Maximum number of ComponentVariable entries that can be sent in one GetReportRequest or GetMonitoringReportRequest message.
ItemsPerMessage,
/// Label for a component. Specifies a non-unique label to be used in a hierarchy UI rendering, in place of the unique component name and instance
Label,
/// Default language code, per RFC 5646, of this Charging Station.
Language,
/// General Purpose linear distance measure.
Length,
/// Indicates how long it takes until a token expires in the authorization cache since it is last used.
LifeTime,
/// (Ambient) light level. The value is in Lux.
Light,
/// If at the Charging Station side a change in the limit in a ChargingProfile is lower than this percentage, the Charging Station MAY skip sending a NotifyChargingLimitRequest or a TransactionEventRequest message to the CSMS.
LimitChangeSignificance,
/// Whether the Charging Station, when _Offline_, will start a transaction for locally-authorized identifiers.
LocalAuthorizeOffline,
/// Variable with instances to control local load-balancing.
LocalLoadBalancing,
/// Whether the Charging Station, when online, will start a transaction for locally-authorized identifiers without waiting for or requesting an AuthorizeResponse from the CSMS.
LocalPreAuthorize,
/// Points to a logical parent component, to allow rendering a comprehensive overview of the Charging Station components in a UI.
LogicalParent,
/// Component Manufacturer name
Manufacturer,
/// IdTokens that have this id as groupId belong to the Master Pass Group.
MasterPassGroupId,
/// This configuration variable can be used to limit the size of the 'certificateChain' field from the CertificateSignedRequest PDU.
MaxCertificateChainSize,
/// Maximum amount of energy in Wh delivered when an identifier is deauthorized by the CSMS after start of a transaction.
MaxEnergyOnInvalidId,
/// Defines the highest value that a charging profile id of a `ChargingStationExternalConstraints` profile in the Charging Station can have.
MaxExternalConstraintsId,
/// For ISO15118Ctrlr: The maximum number of _priceRuleStacks_ and _priceLevelScheduleEntries_ that Charging Station is able to accept in a ChargingScheduleType.
MaxPriceElements,
/// Measurand(s) to be included in \<\<metervaluesrequest,MeterValuesRequest\>\> or \<\<transactioneventrequest,TransactionEventRequest\>\>
Measurands,
/// Specific stored message for display.
Message,
/// How long the Charging Station should wait before resubmitting a TransactionEventRequest message that the CSMS failed to process.
MessageAttemptInterval,
/// How often the Charging Station should try to submit a TransactionEventRequest message when the CSMS fails to process it.
MessageAttempts,
/// The purpose of the message timeout is to be able to consider a request message as not sent and continue with other tasks when the message did not arrive due to communication errors or software failure.
MessageTimeout,
/// Minimum duration that a Charging Station or EVSE status is stable before StatusNotificationRequest is sent to the CSMS.
MinimumStatusDuration,
/// Operating mode string from among valid options (communicated by OptionList, etc. during capability/configuration discovery).
Mode,
/// Manufacturer's Model code/number of Component, including suffixes etc. to identify functional, regional or linguistic variation, but NOT engineering change level internal variation not affecting external behaviour, etc.
Model,
/// Current network address of a Component.
NetworkAddress,
/// A comma separated ordered list of the priority of the possible Network Connection Profiles. The list of possible available profile slots for the network configuration profiles SHALL be reported, via the valuesList characteristic of this Variable.
NetworkConfigurationPriority,
/// Specifies the number of connection attempts the Charging Station executes before switching to a different profile.
NetworkProfileConnectionAttempts,
/// Date time of the next time offset transition. On this date time, the clock displayed to the EV driver will be given the new offset as configured via `TimeOffsetNextTransition`.
NextTimeOffsetTransitionDateTime,
/// For ReservationCtrlr: If this configuration variable is present and set to _true_: Charging Station supports reservation where EVSE id is not specified.
NonEvseSpecific,
/// For ISO15118Ctrlr: The SECC (EVSE) uses the NotificationMaxDelay element in the EVSEStatus to indicate the time in seconds until it expects the EVCC (EV) to react on the action request indicated in EVSENotification.
NotificationMaxDelay,
/// Indicates if the Charging Station should include the externally set charging limit/schedule in the message when it sends a NotifyChargingLimitRequest message.
NotifyChargingLimitWithSchedules,
/// This contains the address of the NTP server.
NtpServerUri,
/// Use the NTP server provided via DHCP, or use the manually configured NTP server.
NtpSource,
/// When set and the Charging Station is _offline_, the Charging Station shall queue any NotifyEventRequest messages triggered by a monitor with a severity number equal to or lower than the severity configured here.
OfflineQueuingSeverity,
/// Message (and/or tariff information) to be shown to an EV Driver when Charging Station is offline.
OfflineTariffFallbackMessage,
/// When the offline period of a Charging Station exceeds the `OfflineThreshold` it is recommended to send a StatusNotificationRequest for all its Connectors when the Charging Station is back online.
OfflineThreshold,
/// If this key exists and is true, the Charging Station supports Unknown Offline Authorization.
OfflineTxForUnknownIdEnabled,
/// The Component operated in an instantaneous, transient, or immediately self-resetting pattern. Used only in event notifications, where it is always true.
Operated,
/// Recurring operating times in iCalendar RRULE format.
OperatingTimes,
/// The organizationName of the CSO operating the charging station.
OrganizationName,
/// Component is in Overload state.
Overload,
/// Generic dimensionless value reporting/setting value.
Percent,
/// Maximum number of periods that may be defined per ChargingSchedule.
PeriodsPerSchedule,
/// This variable describes the phase rotation of a Component relative to its parent Component, using a
PhaseRotation,
/// If defined and true, this Charging Station supports switching from 3 to 1 phase during a transaction.
Phases3to1,
/// Points to a physical parent component (container), to allow rendering an overview of the Charging Station component locations in a UI.
PhysicalParent,
/// If this variable is _true_, then ISO 15118 plug and charge as described by use case C07 - Authorization using Contract Certificates is enabled.
PnCEnabled,
/// Cache Entry Replacement Policy: least recently used, least frequently used, first in first out, other custom mechanism.
Policy,
/// Elapsed time in seconds since last substantive energy transfer
PostChargingTime,
/// Instantaneous (real) Power (measured/calculated, including power factor for AC). Where a component (e.g. AC to DC Power Converter) has multiple power measurements, the default (unkeyed) instance is “input” power.
Power,
/// Component exists, but might not be locally configured/wired for use, nor (remotely) Enabled.
Present,
/// Component itself has a 'Problem' condition that impacts in any significant way on its normal operation. By definition, 'Problem' state includes (logical OR) 'Fault' state. 'Problem' specifically INCLUDES inability to operate that is propagated (up/down/sideways) from any other associated/connected/containing/contained Component.
Problem,
/// Maximum acceptable value for _stackLevel_ in a ChargingProfile.
ProfileStackLevel,
/// Applies to 'sensor' type Components that have an associated protection capability, whereby they can disconnect power (e.g. using the main PowerContactor) if the sensed quantity is outside preset/configured limits. If Protecting is true, the Component is actively preventing/interrupting charging.
Protecting,
/// For ConnectedEV: A string with the following comma-separated items: “\<uri\>,\<major\>,\<minor\>”. This is the protocol uri and version information that was agreed upon between EV and EVSE in the supportedAppProtocolReq handshake from ISO 15118.
ProtocolAgreed,
/// For ISO15118Ctrlr: A string with the following comma-separated items: “\<uri\>,\<major\>,\<minor\>”. \<uri\> is in the format as used in the SupportedAppProtocolReq message from ISO 15118-2 and ISO 15118-20. This variable has at most 20 instances, one for each supported protocol version.
ProtocolSupported,
/// For ConnectedEV: A string with the following comma-separated items: “\<uri\>,\<major\>,\<minor\>”. This is information from the SupportedAppProtocolReq message from ISO 15118. Each priority is given its own variable instance. Priority is a number from 1 to 20 as a string.
ProtocolSupportedByEV,
/// Configuration variable that can be used to retrieve the public key for a meter connected to a specific EVSE.
PublicKey,
/// This Configuration Variable can be used to configure whether a public key needs to be sent with a signed meter value.
PublicKeyWithSignedMeterValue,
/// When this variable is set to _true_, the Charging Station will queue all message until they are delivered to the CSMS.
QueueAllMessages,
/// A list of supported quantities (A, W) for use in a ChargingSchedule.
RateUnit,
/// If this variable reports a value of _true_, then meter values of measurand `Energy.Active.Import.Register` will only report the total energy over all phases without reporting the individual phase values.
RegisterValuesWithoutPhases,
/// Number of seconds remaining to charge to bulk state of charge, given by StateOfChargeBulk.
RemainingTimeBulk,
/// Number of seconds remaining to charge to 100% state of charge.
RemainingTimeFull,
/// This Configuration Variable can be used to limit the following fields: GetVariableResult.attributeValue, VariableAttribute.value and EventData.actualValue.
ReportingValueSize,
/// For ISO15118Ctrlr: If this variable is _true_, then Charging Station shall request a metering receipt
RequestMeteringReceipt,
/// Number of times to retry a reset of the Charging Station when a reset was unsuccessful.
ResetRetries,
/// This variable defines the maximum number of seconds that a transaction may be interrupted by a power outage and still be resumed afterwards.
ResumptionTimeout,
/// The set of measurands to be sampled by the DataCollector component.
SampledMeasurands,
/// The sampling interval in *seconds*.
SamplingInterval,
/// The name of the SECC in the string format as required by ISO 15118.
SeccId,
/// This configuration variable is used to report the security profile used by the Charging Station.
SecurityProfile,
/// For AlignedDataCtrlr: If set to _true_, the Charging Station SHALL only send clock aligned meter values when there is no transaction ongoing.
SendDuringIdle,
/// Serial number of Component.
SerialNumber,
/// For ISO15118Ctrlr: If set to 'True' the SECC (EVSE) is capable of ServiceRenegotiation.
ServiceRenegotiationSupport,
/// If set to _true_, the Charging Station SHALL include signed meter values in the TransactionEventRequest(Ended).
SignReadings,
/// If set to _true_, the Charging Station SHALL include signed meter values for _context_ = `Transaction.Begin` in the _metervalues_ field in the TransactionEventRequest(Started or Updated).
SignStartedReadings,
/// If set to _true_, the Charging Station SHALL include signed meter values in the _metervalues_ field in the TransactionEventRequest(Updated).
SignUpdatedReadings,
/// (Radio/Wired/Optical) data signal strength, in ASU (typically 0-31 or 99 for unknown). Or dbmW (typically -140 to -50).
SignalStrength,
/// This variable represents the status of the door of the battery slot.
SlotStatus,
/// SoC of the component BatteryCartridge which refers to the battery that is inserted at the EVSE.
SoC,
/// SoH of the component BatteryCartridge which refers to the battery that is inserted at the EVSE.
SoH,
/// A state code or name identifier string, to allow the internal state of components to be reported and/or controlled
State,
/// Energy Storage Device (e.g. battery) state of charge, expressed as a percentage of nominal design 0-100% operating range. The value of StateOfCharge.maxSet represents the maximum state of charge for a full battery and is usually at or near 100%.
StateOfCharge,
/// Energy Storage Device (e.g. battery) state of charge up to which fast charging is possible. Above this percentage charging speed will drop significantly.
StateOfChargeBulk,
/// When set to _true_, the Charging Station SHALL deauthorize the transaction when the cable is unplugged from the EV.
StopTxOnEVSideDisconnect,
/// Whether the Charging Station will deauthorize an ongoing transaction when it receives a non- _Accepted_ authorization status in TransactionEventResponse for this transaction.
StopTxOnInvalidId,
/// In bytes. Amount of storage occupied. Storage(maxLimit) specifies absolute limit Storage(MaxSet) restricts usage to specified Max, if supported.
Storage,
/// Number of alternating current phases connected/available. 1 or 3 for AC, 0 means DC (no alternating phases). Null value indicates that the number of phases (e.g. in use) is unknown.
SupplyPhases,
/// For LocalAuthListCtrlr: When set to _true_ Charging Station will disregard idTokens for authorization as if not present in the Local Authorization List when current date/time is past the value of _cacheExpiryDateTime_.
SupportsExpiryDateTime,
/// If Suspending is true, the Component can is currently suspending charging.
Suspending,
/// Applies to 'sensor' type Components that have a charging suspension capability, typically for safety or equipment protection reasons. If Suspension is true, the component can suspend charging when the sensed quantity is outside preset/configured limits.
Suspension,
/// Message (and/or tariff information) to be shown to an EV Driver when there is no driver specific tariff information available.
TariffFallbackMessage,
/// Temperature(s) of component (in Celsius, by default). Components may have multiple indexed temperature sensors.
Temperature,
/// Point in time value, in ISO 8601 datetime format. Time zone optional.
Time,
/// When the clock time is adjusted forwards or backwards for more then TimeAdjustmentReportingThreshold number of seconds, a SecurityEventNotification( 'SettingSystemTime' ) is sent by the charging station.
TimeAdjustmentReportingThreshold,
/// A Time Offset with respect to Coordinated Universal Time (aka UTC or Greenwich Mean Time) in the form of an \[RFC3339\] time (zone) offset suffix, including the mandatory “+” or “-“ prefix.
TimeOffset,
/// Via this variable, the Charging Station provides the CSMS with the option to configure a clock source.
TimeSource,
/// Configured current local time zone in the format: 'Europe/Oslo', 'Asia/Singapore' etc.
TimeZone,
/// Generic timeout value for Component operation (in seconds).
///
/// Also listed as: For BatterySwapCtrlr: Timeout in seconds in which a set of batteries must be inserted or removed after successful authorization.
Timeout,
/// String of bytes representing an ID token.
Token,
/// Type of Token. Value is one of IdTokenEnumStringType (See Appendix 7).
TokenType,
/// Message to be shown to an EV Driver when the Charging Station cannot retrieve the cost for a transaction at the end of the transaction.
TotalCostFallbackMessage,
/// Number of attempts done by a Component.
Tries,
/// Single-shot device requires explicit intervention to re-prime/activate to normal.
Tripped,
/// With this configuration variable the Charging Station can be configured to allow charging before having received a BootNotificationResponse with status: Accepted.
TxBeforeAcceptedEnabled,
/// Interval between sampling of metering (or other) data, intended to be transmitted in the TransactionEventRequest(Ended) message.
TxEndedInterval,
/// Sampled measurands to be included in the _meterValues_ element of TransactionEventRequest(Ended).
TxEndedMeasurands,
/// Start points for a transaction.
TxStartPoint,
/// Sampled measurands to be included in the _meterValues_ element of TransactionEventRequest(Started).
TxStartedMeasurands,
/// Stop points of a transaction.
TxStopPoint,
/// Interval between sampling of metering (or other) data, intended to be transmitted in the TransactionEventRequest(Updated) message.
TxUpdatedInterval,
/// Sampled measurands to be included in the _meterValues_ element of TransactionEventRequest(Updated).
TxUpdatedMeasurands,
/// When set to true, the Charging Station SHALL unlock the cable on the Charging Station side when the cable is unplugged at the EV.
UnlockOnEVSideDisconnect,
/// If this variable is _true_, then ISO 15118 V2G Charging Station certificate installation as described by use case A02 - Update Charging Station Certificate by request of CSMS
V2GCertificateInstallationEnabled,
/// For ConnectedEV: The PEM encoded X.509 leaf/intermediate/root certificate when present in the vehicle certificate chain.
VehicleCertificate,
/// ID that EV provides to charging station. Encoded as a hexbinary string. In ISO 15118 the EVCCID is 6 bytes (MAC address), in CHAdeMO the vehicle id can be 24 bytes.
VehicleId,
/// \[RFC3339\]
VersionDate,
/// Version number of hardware
VersionNumber,
/// Percentage voltage imbalance in three phase supply.
VoltageImbalance,
/// Listed in the specification's device model table but not in its dedicated name table.
VendorName,
/// Listed in the specification's device model table but not in its dedicated name table.
SupportedIdTokenType,
/// Listed in the specification's device model table but not in its dedicated name table.
SelftestActive,
/// Listed in the specification's device model table but not in its dedicated name table.
CHAdeMOProtocolNumber,
/// Listed in the specification's device model table but not in its dedicated name table.
VehicleStatus,
/// Listed in the specification's device model table but not in its dedicated name table.
DynamicControl,
/// Listed in the specification's device model table but not in its dedicated name table.
HighCurrentControl,
/// Listed in the specification's device model table but not in its dedicated name table.
HighVoltageControl,
/// Listed in the specification's device model table but not in its dedicated name table.
AutoManufacturerCode,
/// Listed in the specification's device model table but not in its dedicated name table.
VehicleID,
/// Listed in the specification's device model table but not in its dedicated name table.
BatteryCapacity,
/// Listed in the specification's device model table but not in its dedicated name table.
ValueSize,
/// Listed in the specification's device model table but not in its dedicated name table.
EvseId,
/// Listed in the specification's device model table but not in its dedicated name table.
MaxScheduleEntries,
/// Listed in the specification's device model table but not in its dedicated name table.
RequestedEnergyTransferMode,
/// Listed in the specification's device model table but not in its dedicated name table.
NotificationDelay,
/// Listed in the specification's device model table but not in its dedicated name table.
Capacity,
/// Listed in the specification's device model table but not in its dedicated name table.
MonitoringBase,
/// Listed in the specification's device model table but not in its dedicated name table.
MonitoringLevel,
/// Listed in the specification's device model table but not in its dedicated name table.
RetryBackOffRandomRange,
/// Listed in the specification's device model table but not in its dedicated name table.
RetryBackOffRepeatTimes,
/// Listed in the specification's device model table but not in its dedicated name table.
RetryBackOffWaitMinimum,
/// Listed in the specification's device model table but not in its dedicated name table.
WebSocketPingInterval,
/// Listed in the specification's device model table but not in its dedicated name table.
EnergyTransferResumptionRandomRange,
/// Listed in the specification's device model table but not in its dedicated name table.
OcppCsmsUrl,
/// Listed in the specification's device model table but not in its dedicated name table.
OcppInterface,
/// Listed in the specification's device model table but not in its dedicated name table.
OcppTransport,
/// Listed in the specification's device model table but not in its dedicated name table.
OcppVersion,
/// Listed in the specification's device model table but not in its dedicated name table.
CsmsRootCertificateHashAlgorithm,
/// Listed in the specification's device model table but not in its dedicated name table.
CsmsRootCertificateIssuerKeyHash,
/// Listed in the specification's device model table but not in its dedicated name table.
CsmsRootCertificateIssuerNameHash,
/// Listed in the specification's device model table but not in its dedicated name table.
CsmsRootCertificateSerialNumber,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnEnabled,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnType,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnServer,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnUser,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnGroup,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnPassword,
/// Listed in the specification's device model table but not in its dedicated name table.
VpnKey,
/// Listed in the specification's device model table but not in its dedicated name table.
ApnEnabled,
/// Listed in the specification's device model table but not in its dedicated name table.
Apn,
/// Listed in the specification's device model table but not in its dedicated name table.
ApnUserName,
/// Listed in the specification's device model table but not in its dedicated name table.
ApnPassword,
/// Listed in the specification's device model table but not in its dedicated name table.
SimPin,
/// Listed in the specification's device model table but not in its dedicated name table.
PreferredNetwork,
/// Listed in the specification's device model table but not in its dedicated name table.
UseOnlyPreferredNetwork,
/// Listed in the specification's device model table but not in its dedicated name table.
ApnAuthentication,
/** A value this version's specification doesn't define -- typically a
vendor-specific one, which OCPP explicitly permits.
Bounded at 50 bytes, the same `maxLength` the wire field carries,
so anything the field can hold this can hold. Prefer
[`Self::from_wire_or_other`] over constructing this directly: it
returns the standardized variant when the value is one, keeping a
single representation per wire string.*/
Other(heapless::String<50usize>),
}
impl VariableName {
/// Every value this version's specification defines (260), in spec order.
///
/// Does not include [`Self::Other`], which is unbounded in the
/// values it can hold.
pub const ALL: &'static [Self] = &[
Self::ACCurrent,
Self::ACPhaseSwitchingSupported,
Self::ACVoltage,
Self::Active,
Self::ActiveMonitoringBase,
Self::ActiveMonitoringLevel,
Self::ActiveNetworkProfile,
Self::ActiveTransactionId,
Self::AdditionalInfoItemsPerMessage,
Self::AdditionalRootCertificateCheck,
Self::AllowEnergyTransferResumption,
Self::AllowNewSessionsPendingFirmwareUpdate,
Self::AllowReset,
Self::AllowSecurityProfileDowngrade,
Self::Angle,
Self::Attempts,
Self::AuthorizeRemoteStart,
Self::AvailabilityState,
Self::Available,
Self::BasicAuthPassword,
Self::BytesPerMessage,
Self::CentralContractValidationAllowed,
Self::CertSigningRepeatTimes,
Self::CertSigningWaitMinimum,
Self::Certificate,
Self::CertificateEntries,
Self::CertificateStatusSource,
Self::ChargeProtocol,
Self::ChargingCompleteBulk,
Self::ChargingCompleteFull,
Self::ChargingProfilePersistence,
Self::ChargingState,
Self::ChargingTime,
Self::Color,
Self::CommunicationParent,
Self::Complete,
Self::ConditionsSupported,
Self::ConfigurationValueSize,
Self::ConnectedTime,
Self::ConnectorType,
Self::ContractCertificateInstallationEnabled,
Self::ContractValidationOffline,
Self::Count,
Self::CountryName,
Self::Currency,
Self::CurrentImbalance,
Self::CustomImplementationEnabled,
Self::CustomTriggers,
Self::DCCurrent,
Self::DCInputPhaseControl,
Self::DCVoltage,
Self::DataText,
Self::DateTime,
Self::DepartureTime,
Self::DisablePostAuthorize,
Self::DisableRemoteAuthorization,
Self::DisplayMessages,
Self::ECVariant,
Self::EVConnectionTimeOut,
Self::ElectricalParent,
Self::Enabled,
Self::Energy,
Self::EnergyCapacity,
Self::EnergyExport,
Self::EnergyExportRegister,
Self::EnergyImport,
Self::EnergyImportRegister,
Self::Entries,
Self::ExternalConfigChangeDate,
Self::ExternalConstraintsProfileDisallowed,
Self::ExternalControlSignalsEnabled,
Self::Fallback,
Self::FanSpeed,
Self::FieldLength,
Self::FileTransferProtocols,
Self::FirmwareVersion,
Self::Force,
Self::Formats,
Self::Frequency,
Self::FrequencySchedule,
Self::FuseRating,
Self::HeartbeatInterval,
Self::Height,
Self::Humidity,
Self::Hysteresis,
Self::ICCID,
Self::IMSI,
Self::ISO15118EvseId,
Self::IdToken,
Self::Identity,
Self::Impedance,
Self::Interval,
Self::ItemsPerMessage,
Self::Label,
Self::Language,
Self::Length,
Self::LifeTime,
Self::Light,
Self::LimitChangeSignificance,
Self::LocalAuthorizeOffline,
Self::LocalLoadBalancing,
Self::LocalPreAuthorize,
Self::LogicalParent,
Self::Manufacturer,
Self::MasterPassGroupId,
Self::MaxCertificateChainSize,
Self::MaxEnergyOnInvalidId,
Self::MaxExternalConstraintsId,
Self::MaxPriceElements,
Self::Measurands,
Self::Message,
Self::MessageAttemptInterval,
Self::MessageAttempts,
Self::MessageTimeout,
Self::MinimumStatusDuration,
Self::Mode,
Self::Model,
Self::NetworkAddress,
Self::NetworkConfigurationPriority,
Self::NetworkProfileConnectionAttempts,
Self::NextTimeOffsetTransitionDateTime,
Self::NonEvseSpecific,
Self::NotificationMaxDelay,
Self::NotifyChargingLimitWithSchedules,
Self::NtpServerUri,
Self::NtpSource,
Self::OfflineQueuingSeverity,
Self::OfflineTariffFallbackMessage,
Self::OfflineThreshold,
Self::OfflineTxForUnknownIdEnabled,
Self::Operated,
Self::OperatingTimes,
Self::OrganizationName,
Self::Overload,
Self::Percent,
Self::PeriodsPerSchedule,
Self::PhaseRotation,
Self::Phases3to1,
Self::PhysicalParent,
Self::PnCEnabled,
Self::Policy,
Self::PostChargingTime,
Self::Power,
Self::Present,
Self::Problem,
Self::ProfileStackLevel,
Self::Protecting,
Self::ProtocolAgreed,
Self::ProtocolSupported,
Self::ProtocolSupportedByEV,
Self::PublicKey,
Self::PublicKeyWithSignedMeterValue,
Self::QueueAllMessages,
Self::RateUnit,
Self::RegisterValuesWithoutPhases,
Self::RemainingTimeBulk,
Self::RemainingTimeFull,
Self::ReportingValueSize,
Self::RequestMeteringReceipt,
Self::ResetRetries,
Self::ResumptionTimeout,
Self::SampledMeasurands,
Self::SamplingInterval,
Self::SeccId,
Self::SecurityProfile,
Self::SendDuringIdle,
Self::SerialNumber,
Self::ServiceRenegotiationSupport,
Self::SignReadings,
Self::SignStartedReadings,
Self::SignUpdatedReadings,
Self::SignalStrength,
Self::SlotStatus,
Self::SoC,
Self::SoH,
Self::State,
Self::StateOfCharge,
Self::StateOfChargeBulk,
Self::StopTxOnEVSideDisconnect,
Self::StopTxOnInvalidId,
Self::Storage,
Self::SupplyPhases,
Self::SupportsExpiryDateTime,
Self::Suspending,
Self::Suspension,
Self::TariffFallbackMessage,
Self::Temperature,
Self::Time,
Self::TimeAdjustmentReportingThreshold,
Self::TimeOffset,
Self::TimeSource,
Self::TimeZone,
Self::Timeout,
Self::Token,
Self::TokenType,
Self::TotalCostFallbackMessage,
Self::Tries,
Self::Tripped,
Self::TxBeforeAcceptedEnabled,
Self::TxEndedInterval,
Self::TxEndedMeasurands,
Self::TxStartPoint,
Self::TxStartedMeasurands,
Self::TxStopPoint,
Self::TxUpdatedInterval,
Self::TxUpdatedMeasurands,
Self::UnlockOnEVSideDisconnect,
Self::V2GCertificateInstallationEnabled,
Self::VehicleCertificate,
Self::VehicleId,
Self::VersionDate,
Self::VersionNumber,
Self::VoltageImbalance,
Self::VendorName,
Self::SupportedIdTokenType,
Self::SelftestActive,
Self::CHAdeMOProtocolNumber,
Self::VehicleStatus,
Self::DynamicControl,
Self::HighCurrentControl,
Self::HighVoltageControl,
Self::AutoManufacturerCode,
Self::VehicleID,
Self::BatteryCapacity,
Self::ValueSize,
Self::EvseId,
Self::MaxScheduleEntries,
Self::RequestedEnergyTransferMode,
Self::NotificationDelay,
Self::Capacity,
Self::MonitoringBase,
Self::MonitoringLevel,
Self::RetryBackOffRandomRange,
Self::RetryBackOffRepeatTimes,
Self::RetryBackOffWaitMinimum,
Self::WebSocketPingInterval,
Self::EnergyTransferResumptionRandomRange,
Self::OcppCsmsUrl,
Self::OcppInterface,
Self::OcppTransport,
Self::OcppVersion,
Self::CsmsRootCertificateHashAlgorithm,
Self::CsmsRootCertificateIssuerKeyHash,
Self::CsmsRootCertificateIssuerNameHash,
Self::CsmsRootCertificateSerialNumber,
Self::VpnEnabled,
Self::VpnType,
Self::VpnServer,
Self::VpnUser,
Self::VpnGroup,
Self::VpnPassword,
Self::VpnKey,
Self::ApnEnabled,
Self::Apn,
Self::ApnUserName,
Self::ApnPassword,
Self::SimPin,
Self::PreferredNetwork,
Self::UseOnlyPreferredNetwork,
Self::ApnAuthentication,
];
/// This value as it appears on the wire.
pub fn as_str(&self) -> &str {
match self {
Self::ACCurrent => "ACCurrent",
Self::ACPhaseSwitchingSupported => "ACPhaseSwitchingSupported",
Self::ACVoltage => "ACVoltage",
Self::Active => "Active",
Self::ActiveMonitoringBase => "ActiveMonitoringBase",
Self::ActiveMonitoringLevel => "ActiveMonitoringLevel",
Self::ActiveNetworkProfile => "ActiveNetworkProfile",
Self::ActiveTransactionId => "ActiveTransactionId",
Self::AdditionalInfoItemsPerMessage => "AdditionalInfoItemsPerMessage",
Self::AdditionalRootCertificateCheck => "AdditionalRootCertificateCheck",
Self::AllowEnergyTransferResumption => "AllowEnergyTransferResumption",
Self::AllowNewSessionsPendingFirmwareUpdate => {
"AllowNewSessionsPendingFirmwareUpdate"
}
Self::AllowReset => "AllowReset",
Self::AllowSecurityProfileDowngrade => "AllowSecurityProfileDowngrade",
Self::Angle => "Angle",
Self::Attempts => "Attempts",
Self::AuthorizeRemoteStart => "AuthorizeRemoteStart",
Self::AvailabilityState => "AvailabilityState",
Self::Available => "Available",
Self::BasicAuthPassword => "BasicAuthPassword",
Self::BytesPerMessage => "BytesPerMessage",
Self::CentralContractValidationAllowed => "CentralContractValidationAllowed",
Self::CertSigningRepeatTimes => "CertSigningRepeatTimes",
Self::CertSigningWaitMinimum => "CertSigningWaitMinimum",
Self::Certificate => "Certificate",
Self::CertificateEntries => "CertificateEntries",
Self::CertificateStatusSource => "CertificateStatusSource",
Self::ChargeProtocol => "ChargeProtocol",
Self::ChargingCompleteBulk => "ChargingCompleteBulk",
Self::ChargingCompleteFull => "ChargingCompleteFull",
Self::ChargingProfilePersistence => "ChargingProfilePersistence",
Self::ChargingState => "ChargingState",
Self::ChargingTime => "ChargingTime",
Self::Color => "Color",
Self::CommunicationParent => "CommunicationParent",
Self::Complete => "Complete",
Self::ConditionsSupported => "ConditionsSupported",
Self::ConfigurationValueSize => "ConfigurationValueSize",
Self::ConnectedTime => "ConnectedTime",
Self::ConnectorType => "ConnectorType",
Self::ContractCertificateInstallationEnabled => {
"ContractCertificateInstallationEnabled"
}
Self::ContractValidationOffline => "ContractValidationOffline",
Self::Count => "Count",
Self::CountryName => "CountryName",
Self::Currency => "Currency",
Self::CurrentImbalance => "CurrentImbalance",
Self::CustomImplementationEnabled => "CustomImplementationEnabled",
Self::CustomTriggers => "CustomTriggers",
Self::DCCurrent => "DCCurrent",
Self::DCInputPhaseControl => "DCInputPhaseControl",
Self::DCVoltage => "DCVoltage",
Self::DataText => "DataText",
Self::DateTime => "DateTime",
Self::DepartureTime => "DepartureTime",
Self::DisablePostAuthorize => "DisablePostAuthorize",
Self::DisableRemoteAuthorization => "DisableRemoteAuthorization",
Self::DisplayMessages => "DisplayMessages",
Self::ECVariant => "ECVariant",
Self::EVConnectionTimeOut => "EVConnectionTimeOut",
Self::ElectricalParent => "ElectricalParent",
Self::Enabled => "Enabled",
Self::Energy => "Energy",
Self::EnergyCapacity => "EnergyCapacity",
Self::EnergyExport => "EnergyExport",
Self::EnergyExportRegister => "EnergyExportRegister",
Self::EnergyImport => "EnergyImport",
Self::EnergyImportRegister => "EnergyImportRegister",
Self::Entries => "Entries",
Self::ExternalConfigChangeDate => "ExternalConfigChangeDate",
Self::ExternalConstraintsProfileDisallowed => {
"ExternalConstraintsProfileDisallowed"
}
Self::ExternalControlSignalsEnabled => "ExternalControlSignalsEnabled",
Self::Fallback => "Fallback",
Self::FanSpeed => "FanSpeed",
Self::FieldLength => "FieldLength",
Self::FileTransferProtocols => "FileTransferProtocols",
Self::FirmwareVersion => "FirmwareVersion",
Self::Force => "Force",
Self::Formats => "Formats",
Self::Frequency => "Frequency",
Self::FrequencySchedule => "FrequencySchedule",
Self::FuseRating => "FuseRating",
Self::HeartbeatInterval => "HeartbeatInterval",
Self::Height => "Height",
Self::Humidity => "Humidity",
Self::Hysteresis => "Hysteresis",
Self::ICCID => "ICCID",
Self::IMSI => "IMSI",
Self::ISO15118EvseId => "ISO15118EvseId",
Self::IdToken => "IdToken",
Self::Identity => "Identity",
Self::Impedance => "Impedance",
Self::Interval => "Interval",
Self::ItemsPerMessage => "ItemsPerMessage",
Self::Label => "Label",
Self::Language => "Language",
Self::Length => "Length",
Self::LifeTime => "LifeTime",
Self::Light => "Light",
Self::LimitChangeSignificance => "LimitChangeSignificance",
Self::LocalAuthorizeOffline => "LocalAuthorizeOffline",
Self::LocalLoadBalancing => "LocalLoadBalancing",
Self::LocalPreAuthorize => "LocalPreAuthorize",
Self::LogicalParent => "LogicalParent",
Self::Manufacturer => "Manufacturer",
Self::MasterPassGroupId => "MasterPassGroupId",
Self::MaxCertificateChainSize => "MaxCertificateChainSize",
Self::MaxEnergyOnInvalidId => "MaxEnergyOnInvalidId",
Self::MaxExternalConstraintsId => "MaxExternalConstraintsId",
Self::MaxPriceElements => "MaxPriceElements",
Self::Measurands => "Measurands",
Self::Message => "Message",
Self::MessageAttemptInterval => "MessageAttemptInterval",
Self::MessageAttempts => "MessageAttempts",
Self::MessageTimeout => "MessageTimeout",
Self::MinimumStatusDuration => "MinimumStatusDuration",
Self::Mode => "Mode",
Self::Model => "Model",
Self::NetworkAddress => "NetworkAddress",
Self::NetworkConfigurationPriority => "NetworkConfigurationPriority",
Self::NetworkProfileConnectionAttempts => "NetworkProfileConnectionAttempts",
Self::NextTimeOffsetTransitionDateTime => "NextTimeOffsetTransitionDateTime",
Self::NonEvseSpecific => "NonEvseSpecific",
Self::NotificationMaxDelay => "NotificationMaxDelay",
Self::NotifyChargingLimitWithSchedules => "NotifyChargingLimitWithSchedules",
Self::NtpServerUri => "NtpServerUri",
Self::NtpSource => "NtpSource",
Self::OfflineQueuingSeverity => "OfflineQueuingSeverity",
Self::OfflineTariffFallbackMessage => "OfflineTariffFallbackMessage",
Self::OfflineThreshold => "OfflineThreshold",
Self::OfflineTxForUnknownIdEnabled => "OfflineTxForUnknownIdEnabled",
Self::Operated => "Operated",
Self::OperatingTimes => "OperatingTimes",
Self::OrganizationName => "OrganizationName",
Self::Overload => "Overload",
Self::Percent => "Percent",
Self::PeriodsPerSchedule => "PeriodsPerSchedule",
Self::PhaseRotation => "PhaseRotation",
Self::Phases3to1 => "Phases3to1",
Self::PhysicalParent => "PhysicalParent",
Self::PnCEnabled => "PnCEnabled",
Self::Policy => "Policy",
Self::PostChargingTime => "PostChargingTime",
Self::Power => "Power",
Self::Present => "Present",
Self::Problem => "Problem",
Self::ProfileStackLevel => "ProfileStackLevel",
Self::Protecting => "Protecting",
Self::ProtocolAgreed => "ProtocolAgreed",
Self::ProtocolSupported => "ProtocolSupported",
Self::ProtocolSupportedByEV => "ProtocolSupportedByEV",
Self::PublicKey => "PublicKey",
Self::PublicKeyWithSignedMeterValue => "PublicKeyWithSignedMeterValue",
Self::QueueAllMessages => "QueueAllMessages",
Self::RateUnit => "RateUnit",
Self::RegisterValuesWithoutPhases => "RegisterValuesWithoutPhases",
Self::RemainingTimeBulk => "RemainingTimeBulk",
Self::RemainingTimeFull => "RemainingTimeFull",
Self::ReportingValueSize => "ReportingValueSize",
Self::RequestMeteringReceipt => "RequestMeteringReceipt",
Self::ResetRetries => "ResetRetries",
Self::ResumptionTimeout => "ResumptionTimeout",
Self::SampledMeasurands => "SampledMeasurands",
Self::SamplingInterval => "SamplingInterval",
Self::SeccId => "SeccId",
Self::SecurityProfile => "SecurityProfile",
Self::SendDuringIdle => "SendDuringIdle",
Self::SerialNumber => "SerialNumber",
Self::ServiceRenegotiationSupport => "ServiceRenegotiationSupport",
Self::SignReadings => "SignReadings",
Self::SignStartedReadings => "SignStartedReadings",
Self::SignUpdatedReadings => "SignUpdatedReadings",
Self::SignalStrength => "SignalStrength",
Self::SlotStatus => "SlotStatus",
Self::SoC => "SoC",
Self::SoH => "SoH",
Self::State => "State",
Self::StateOfCharge => "StateOfCharge",
Self::StateOfChargeBulk => "StateOfChargeBulk",
Self::StopTxOnEVSideDisconnect => "StopTxOnEVSideDisconnect",
Self::StopTxOnInvalidId => "StopTxOnInvalidId",
Self::Storage => "Storage",
Self::SupplyPhases => "SupplyPhases",
Self::SupportsExpiryDateTime => "SupportsExpiryDateTime",
Self::Suspending => "Suspending",
Self::Suspension => "Suspension",
Self::TariffFallbackMessage => "TariffFallbackMessage",
Self::Temperature => "Temperature",
Self::Time => "Time",
Self::TimeAdjustmentReportingThreshold => "TimeAdjustmentReportingThreshold",
Self::TimeOffset => "TimeOffset",
Self::TimeSource => "TimeSource",
Self::TimeZone => "TimeZone",
Self::Timeout => "Timeout",
Self::Token => "Token",
Self::TokenType => "TokenType",
Self::TotalCostFallbackMessage => "TotalCostFallbackMessage",
Self::Tries => "Tries",
Self::Tripped => "Tripped",
Self::TxBeforeAcceptedEnabled => "TxBeforeAcceptedEnabled",
Self::TxEndedInterval => "TxEndedInterval",
Self::TxEndedMeasurands => "TxEndedMeasurands",
Self::TxStartPoint => "TxStartPoint",
Self::TxStartedMeasurands => "TxStartedMeasurands",
Self::TxStopPoint => "TxStopPoint",
Self::TxUpdatedInterval => "TxUpdatedInterval",
Self::TxUpdatedMeasurands => "TxUpdatedMeasurands",
Self::UnlockOnEVSideDisconnect => "UnlockOnEVSideDisconnect",
Self::V2GCertificateInstallationEnabled => {
"V2GCertificateInstallationEnabled"
}
Self::VehicleCertificate => "VehicleCertificate",
Self::VehicleId => "VehicleId",
Self::VersionDate => "VersionDate",
Self::VersionNumber => "VersionNumber",
Self::VoltageImbalance => "VoltageImbalance",
Self::VendorName => "VendorName",
Self::SupportedIdTokenType => "SupportedIdTokenType",
Self::SelftestActive => "SelftestActive",
Self::CHAdeMOProtocolNumber => "CHAdeMOProtocolNumber",
Self::VehicleStatus => "VehicleStatus",
Self::DynamicControl => "DynamicControl",
Self::HighCurrentControl => "HighCurrentControl",
Self::HighVoltageControl => "HighVoltageControl",
Self::AutoManufacturerCode => "AutoManufacturerCode",
Self::VehicleID => "VehicleID",
Self::BatteryCapacity => "BatteryCapacity",
Self::ValueSize => "ValueSize",
Self::EvseId => "EvseId",
Self::MaxScheduleEntries => "MaxScheduleEntries",
Self::RequestedEnergyTransferMode => "RequestedEnergyTransferMode",
Self::NotificationDelay => "NotificationDelay",
Self::Capacity => "Capacity",
Self::MonitoringBase => "MonitoringBase",
Self::MonitoringLevel => "MonitoringLevel",
Self::RetryBackOffRandomRange => "RetryBackOffRandomRange",
Self::RetryBackOffRepeatTimes => "RetryBackOffRepeatTimes",
Self::RetryBackOffWaitMinimum => "RetryBackOffWaitMinimum",
Self::WebSocketPingInterval => "WebSocketPingInterval",
Self::EnergyTransferResumptionRandomRange => {
"EnergyTransferResumptionRandomRange"
}
Self::OcppCsmsUrl => "OcppCsmsUrl",
Self::OcppInterface => "OcppInterface",
Self::OcppTransport => "OcppTransport",
Self::OcppVersion => "OcppVersion",
Self::CsmsRootCertificateHashAlgorithm => "CsmsRootCertificateHashAlgorithm",
Self::CsmsRootCertificateIssuerKeyHash => "CsmsRootCertificateIssuerKeyHash",
Self::CsmsRootCertificateIssuerNameHash => {
"CsmsRootCertificateIssuerNameHash"
}
Self::CsmsRootCertificateSerialNumber => "CsmsRootCertificateSerialNumber",
Self::VpnEnabled => "VpnEnabled",
Self::VpnType => "VpnType",
Self::VpnServer => "VpnServer",
Self::VpnUser => "VpnUser",
Self::VpnGroup => "VpnGroup",
Self::VpnPassword => "VpnPassword",
Self::VpnKey => "VpnKey",
Self::ApnEnabled => "ApnEnabled",
Self::Apn => "Apn",
Self::ApnUserName => "ApnUserName",
Self::ApnPassword => "ApnPassword",
Self::SimPin => "SimPin",
Self::PreferredNetwork => "PreferredNetwork",
Self::UseOnlyPreferredNetwork => "UseOnlyPreferredNetwork",
Self::ApnAuthentication => "ApnAuthentication",
Self::Other(value) => value.as_str(),
}
}
/// Parses a wire value, returning `None` for values the
/// specification doesn't define.
///
/// Use this to ask "is this one of the spec's values?". To accept
/// any value, use [`Self::from_wire_or_other`].
pub fn from_wire(value: &str) -> Option<Self> {
match value {
"ACCurrent" => Some(Self::ACCurrent),
"ACPhaseSwitchingSupported" => Some(Self::ACPhaseSwitchingSupported),
"ACVoltage" => Some(Self::ACVoltage),
"Active" => Some(Self::Active),
"ActiveMonitoringBase" => Some(Self::ActiveMonitoringBase),
"ActiveMonitoringLevel" => Some(Self::ActiveMonitoringLevel),
"ActiveNetworkProfile" => Some(Self::ActiveNetworkProfile),
"ActiveTransactionId" => Some(Self::ActiveTransactionId),
"AdditionalInfoItemsPerMessage" => Some(Self::AdditionalInfoItemsPerMessage),
"AdditionalRootCertificateCheck" => {
Some(Self::AdditionalRootCertificateCheck)
}
"AllowEnergyTransferResumption" => Some(Self::AllowEnergyTransferResumption),
"AllowNewSessionsPendingFirmwareUpdate" => {
Some(Self::AllowNewSessionsPendingFirmwareUpdate)
}
"AllowReset" => Some(Self::AllowReset),
"AllowSecurityProfileDowngrade" => Some(Self::AllowSecurityProfileDowngrade),
"Angle" => Some(Self::Angle),
"Attempts" => Some(Self::Attempts),
"AuthorizeRemoteStart" => Some(Self::AuthorizeRemoteStart),
"AvailabilityState" => Some(Self::AvailabilityState),
"Available" => Some(Self::Available),
"BasicAuthPassword" => Some(Self::BasicAuthPassword),
"BytesPerMessage" => Some(Self::BytesPerMessage),
"CentralContractValidationAllowed" => {
Some(Self::CentralContractValidationAllowed)
}
"CertSigningRepeatTimes" => Some(Self::CertSigningRepeatTimes),
"CertSigningWaitMinimum" => Some(Self::CertSigningWaitMinimum),
"Certificate" => Some(Self::Certificate),
"CertificateEntries" => Some(Self::CertificateEntries),
"CertificateStatusSource" => Some(Self::CertificateStatusSource),
"ChargeProtocol" => Some(Self::ChargeProtocol),
"ChargingCompleteBulk" => Some(Self::ChargingCompleteBulk),
"ChargingCompleteFull" => Some(Self::ChargingCompleteFull),
"ChargingProfilePersistence" => Some(Self::ChargingProfilePersistence),
"ChargingState" => Some(Self::ChargingState),
"ChargingTime" => Some(Self::ChargingTime),
"Color" => Some(Self::Color),
"CommunicationParent" => Some(Self::CommunicationParent),
"Complete" => Some(Self::Complete),
"ConditionsSupported" => Some(Self::ConditionsSupported),
"ConfigurationValueSize" => Some(Self::ConfigurationValueSize),
"ConnectedTime" => Some(Self::ConnectedTime),
"ConnectorType" => Some(Self::ConnectorType),
"ContractCertificateInstallationEnabled" => {
Some(Self::ContractCertificateInstallationEnabled)
}
"ContractValidationOffline" => Some(Self::ContractValidationOffline),
"Count" => Some(Self::Count),
"CountryName" => Some(Self::CountryName),
"Currency" => Some(Self::Currency),
"CurrentImbalance" => Some(Self::CurrentImbalance),
"CustomImplementationEnabled" => Some(Self::CustomImplementationEnabled),
"CustomTriggers" => Some(Self::CustomTriggers),
"DCCurrent" => Some(Self::DCCurrent),
"DCInputPhaseControl" => Some(Self::DCInputPhaseControl),
"DCVoltage" => Some(Self::DCVoltage),
"DataText" => Some(Self::DataText),
"DateTime" => Some(Self::DateTime),
"DepartureTime" => Some(Self::DepartureTime),
"DisablePostAuthorize" => Some(Self::DisablePostAuthorize),
"DisableRemoteAuthorization" => Some(Self::DisableRemoteAuthorization),
"DisplayMessages" => Some(Self::DisplayMessages),
"ECVariant" => Some(Self::ECVariant),
"EVConnectionTimeOut" => Some(Self::EVConnectionTimeOut),
"ElectricalParent" => Some(Self::ElectricalParent),
"Enabled" => Some(Self::Enabled),
"Energy" => Some(Self::Energy),
"EnergyCapacity" => Some(Self::EnergyCapacity),
"EnergyExport" => Some(Self::EnergyExport),
"EnergyExportRegister" => Some(Self::EnergyExportRegister),
"EnergyImport" => Some(Self::EnergyImport),
"EnergyImportRegister" => Some(Self::EnergyImportRegister),
"Entries" => Some(Self::Entries),
"ExternalConfigChangeDate" => Some(Self::ExternalConfigChangeDate),
"ExternalConstraintsProfileDisallowed" => {
Some(Self::ExternalConstraintsProfileDisallowed)
}
"ExternalControlSignalsEnabled" => Some(Self::ExternalControlSignalsEnabled),
"Fallback" => Some(Self::Fallback),
"FanSpeed" => Some(Self::FanSpeed),
"FieldLength" => Some(Self::FieldLength),
"FileTransferProtocols" => Some(Self::FileTransferProtocols),
"FirmwareVersion" => Some(Self::FirmwareVersion),
"Force" => Some(Self::Force),
"Formats" => Some(Self::Formats),
"Frequency" => Some(Self::Frequency),
"FrequencySchedule" => Some(Self::FrequencySchedule),
"FuseRating" => Some(Self::FuseRating),
"HeartbeatInterval" => Some(Self::HeartbeatInterval),
"Height" => Some(Self::Height),
"Humidity" => Some(Self::Humidity),
"Hysteresis" => Some(Self::Hysteresis),
"ICCID" => Some(Self::ICCID),
"IMSI" => Some(Self::IMSI),
"ISO15118EvseId" => Some(Self::ISO15118EvseId),
"IdToken" => Some(Self::IdToken),
"Identity" => Some(Self::Identity),
"Impedance" => Some(Self::Impedance),
"Interval" => Some(Self::Interval),
"ItemsPerMessage" => Some(Self::ItemsPerMessage),
"Label" => Some(Self::Label),
"Language" => Some(Self::Language),
"Length" => Some(Self::Length),
"LifeTime" => Some(Self::LifeTime),
"Light" => Some(Self::Light),
"LimitChangeSignificance" => Some(Self::LimitChangeSignificance),
"LocalAuthorizeOffline" => Some(Self::LocalAuthorizeOffline),
"LocalLoadBalancing" => Some(Self::LocalLoadBalancing),
"LocalPreAuthorize" => Some(Self::LocalPreAuthorize),
"LogicalParent" => Some(Self::LogicalParent),
"Manufacturer" => Some(Self::Manufacturer),
"MasterPassGroupId" => Some(Self::MasterPassGroupId),
"MaxCertificateChainSize" => Some(Self::MaxCertificateChainSize),
"MaxEnergyOnInvalidId" => Some(Self::MaxEnergyOnInvalidId),
"MaxExternalConstraintsId" => Some(Self::MaxExternalConstraintsId),
"MaxPriceElements" => Some(Self::MaxPriceElements),
"Measurands" => Some(Self::Measurands),
"Message" => Some(Self::Message),
"MessageAttemptInterval" => Some(Self::MessageAttemptInterval),
"MessageAttempts" => Some(Self::MessageAttempts),
"MessageTimeout" => Some(Self::MessageTimeout),
"MinimumStatusDuration" => Some(Self::MinimumStatusDuration),
"Mode" => Some(Self::Mode),
"Model" => Some(Self::Model),
"NetworkAddress" => Some(Self::NetworkAddress),
"NetworkConfigurationPriority" => Some(Self::NetworkConfigurationPriority),
"NetworkProfileConnectionAttempts" => {
Some(Self::NetworkProfileConnectionAttempts)
}
"NextTimeOffsetTransitionDateTime" => {
Some(Self::NextTimeOffsetTransitionDateTime)
}
"NonEvseSpecific" => Some(Self::NonEvseSpecific),
"NotificationMaxDelay" => Some(Self::NotificationMaxDelay),
"NotifyChargingLimitWithSchedules" => {
Some(Self::NotifyChargingLimitWithSchedules)
}
"NtpServerUri" => Some(Self::NtpServerUri),
"NtpSource" => Some(Self::NtpSource),
"OfflineQueuingSeverity" => Some(Self::OfflineQueuingSeverity),
"OfflineTariffFallbackMessage" => Some(Self::OfflineTariffFallbackMessage),
"OfflineThreshold" => Some(Self::OfflineThreshold),
"OfflineTxForUnknownIdEnabled" => Some(Self::OfflineTxForUnknownIdEnabled),
"Operated" => Some(Self::Operated),
"OperatingTimes" => Some(Self::OperatingTimes),
"OrganizationName" => Some(Self::OrganizationName),
"Overload" => Some(Self::Overload),
"Percent" => Some(Self::Percent),
"PeriodsPerSchedule" => Some(Self::PeriodsPerSchedule),
"PhaseRotation" => Some(Self::PhaseRotation),
"Phases3to1" => Some(Self::Phases3to1),
"PhysicalParent" => Some(Self::PhysicalParent),
"PnCEnabled" => Some(Self::PnCEnabled),
"Policy" => Some(Self::Policy),
"PostChargingTime" => Some(Self::PostChargingTime),
"Power" => Some(Self::Power),
"Present" => Some(Self::Present),
"Problem" => Some(Self::Problem),
"ProfileStackLevel" => Some(Self::ProfileStackLevel),
"Protecting" => Some(Self::Protecting),
"ProtocolAgreed" => Some(Self::ProtocolAgreed),
"ProtocolSupported" => Some(Self::ProtocolSupported),
"ProtocolSupportedByEV" => Some(Self::ProtocolSupportedByEV),
"PublicKey" => Some(Self::PublicKey),
"PublicKeyWithSignedMeterValue" => Some(Self::PublicKeyWithSignedMeterValue),
"QueueAllMessages" => Some(Self::QueueAllMessages),
"RateUnit" => Some(Self::RateUnit),
"RegisterValuesWithoutPhases" => Some(Self::RegisterValuesWithoutPhases),
"RemainingTimeBulk" => Some(Self::RemainingTimeBulk),
"RemainingTimeFull" => Some(Self::RemainingTimeFull),
"ReportingValueSize" => Some(Self::ReportingValueSize),
"RequestMeteringReceipt" => Some(Self::RequestMeteringReceipt),
"ResetRetries" => Some(Self::ResetRetries),
"ResumptionTimeout" => Some(Self::ResumptionTimeout),
"SampledMeasurands" => Some(Self::SampledMeasurands),
"SamplingInterval" => Some(Self::SamplingInterval),
"SeccId" => Some(Self::SeccId),
"SecurityProfile" => Some(Self::SecurityProfile),
"SendDuringIdle" => Some(Self::SendDuringIdle),
"SerialNumber" => Some(Self::SerialNumber),
"ServiceRenegotiationSupport" => Some(Self::ServiceRenegotiationSupport),
"SignReadings" => Some(Self::SignReadings),
"SignStartedReadings" => Some(Self::SignStartedReadings),
"SignUpdatedReadings" => Some(Self::SignUpdatedReadings),
"SignalStrength" => Some(Self::SignalStrength),
"SlotStatus" => Some(Self::SlotStatus),
"SoC" => Some(Self::SoC),
"SoH" => Some(Self::SoH),
"State" => Some(Self::State),
"StateOfCharge" => Some(Self::StateOfCharge),
"StateOfChargeBulk" => Some(Self::StateOfChargeBulk),
"StopTxOnEVSideDisconnect" => Some(Self::StopTxOnEVSideDisconnect),
"StopTxOnInvalidId" => Some(Self::StopTxOnInvalidId),
"Storage" => Some(Self::Storage),
"SupplyPhases" => Some(Self::SupplyPhases),
"SupportsExpiryDateTime" => Some(Self::SupportsExpiryDateTime),
"Suspending" => Some(Self::Suspending),
"Suspension" => Some(Self::Suspension),
"TariffFallbackMessage" => Some(Self::TariffFallbackMessage),
"Temperature" => Some(Self::Temperature),
"Time" => Some(Self::Time),
"TimeAdjustmentReportingThreshold" => {
Some(Self::TimeAdjustmentReportingThreshold)
}
"TimeOffset" => Some(Self::TimeOffset),
"TimeSource" => Some(Self::TimeSource),
"TimeZone" => Some(Self::TimeZone),
"Timeout" => Some(Self::Timeout),
"Token" => Some(Self::Token),
"TokenType" => Some(Self::TokenType),
"TotalCostFallbackMessage" => Some(Self::TotalCostFallbackMessage),
"Tries" => Some(Self::Tries),
"Tripped" => Some(Self::Tripped),
"TxBeforeAcceptedEnabled" => Some(Self::TxBeforeAcceptedEnabled),
"TxEndedInterval" => Some(Self::TxEndedInterval),
"TxEndedMeasurands" => Some(Self::TxEndedMeasurands),
"TxStartPoint" => Some(Self::TxStartPoint),
"TxStartedMeasurands" => Some(Self::TxStartedMeasurands),
"TxStopPoint" => Some(Self::TxStopPoint),
"TxUpdatedInterval" => Some(Self::TxUpdatedInterval),
"TxUpdatedMeasurands" => Some(Self::TxUpdatedMeasurands),
"UnlockOnEVSideDisconnect" => Some(Self::UnlockOnEVSideDisconnect),
"V2GCertificateInstallationEnabled" => {
Some(Self::V2GCertificateInstallationEnabled)
}
"VehicleCertificate" => Some(Self::VehicleCertificate),
"VehicleId" => Some(Self::VehicleId),
"VersionDate" => Some(Self::VersionDate),
"VersionNumber" => Some(Self::VersionNumber),
"VoltageImbalance" => Some(Self::VoltageImbalance),
"VendorName" => Some(Self::VendorName),
"SupportedIdTokenType" => Some(Self::SupportedIdTokenType),
"SelftestActive" => Some(Self::SelftestActive),
"CHAdeMOProtocolNumber" => Some(Self::CHAdeMOProtocolNumber),
"VehicleStatus" => Some(Self::VehicleStatus),
"DynamicControl" => Some(Self::DynamicControl),
"HighCurrentControl" => Some(Self::HighCurrentControl),
"HighVoltageControl" => Some(Self::HighVoltageControl),
"AutoManufacturerCode" => Some(Self::AutoManufacturerCode),
"VehicleID" => Some(Self::VehicleID),
"BatteryCapacity" => Some(Self::BatteryCapacity),
"ValueSize" => Some(Self::ValueSize),
"EvseId" => Some(Self::EvseId),
"MaxScheduleEntries" => Some(Self::MaxScheduleEntries),
"RequestedEnergyTransferMode" => Some(Self::RequestedEnergyTransferMode),
"NotificationDelay" => Some(Self::NotificationDelay),
"Capacity" => Some(Self::Capacity),
"MonitoringBase" => Some(Self::MonitoringBase),
"MonitoringLevel" => Some(Self::MonitoringLevel),
"RetryBackOffRandomRange" => Some(Self::RetryBackOffRandomRange),
"RetryBackOffRepeatTimes" => Some(Self::RetryBackOffRepeatTimes),
"RetryBackOffWaitMinimum" => Some(Self::RetryBackOffWaitMinimum),
"WebSocketPingInterval" => Some(Self::WebSocketPingInterval),
"EnergyTransferResumptionRandomRange" => {
Some(Self::EnergyTransferResumptionRandomRange)
}
"OcppCsmsUrl" => Some(Self::OcppCsmsUrl),
"OcppInterface" => Some(Self::OcppInterface),
"OcppTransport" => Some(Self::OcppTransport),
"OcppVersion" => Some(Self::OcppVersion),
"CsmsRootCertificateHashAlgorithm" => {
Some(Self::CsmsRootCertificateHashAlgorithm)
}
"CsmsRootCertificateIssuerKeyHash" => {
Some(Self::CsmsRootCertificateIssuerKeyHash)
}
"CsmsRootCertificateIssuerNameHash" => {
Some(Self::CsmsRootCertificateIssuerNameHash)
}
"CsmsRootCertificateSerialNumber" => {
Some(Self::CsmsRootCertificateSerialNumber)
}
"VpnEnabled" => Some(Self::VpnEnabled),
"VpnType" => Some(Self::VpnType),
"VpnServer" => Some(Self::VpnServer),
"VpnUser" => Some(Self::VpnUser),
"VpnGroup" => Some(Self::VpnGroup),
"VpnPassword" => Some(Self::VpnPassword),
"VpnKey" => Some(Self::VpnKey),
"ApnEnabled" => Some(Self::ApnEnabled),
"Apn" => Some(Self::Apn),
"ApnUserName" => Some(Self::ApnUserName),
"ApnPassword" => Some(Self::ApnPassword),
"SimPin" => Some(Self::SimPin),
"PreferredNetwork" => Some(Self::PreferredNetwork),
"UseOnlyPreferredNetwork" => Some(Self::UseOnlyPreferredNetwork),
"ApnAuthentication" => Some(Self::ApnAuthentication),
_ => None,
}
}
/// Parses any wire value, falling back to [`Self::Other`].
///
/// Fails only if `value` is longer than the specification's
/// `maxLength` for this field, in which case it isn't a value the
/// field could have carried in the first place.
pub fn from_wire_or_other(value: &str) -> Result<Self, ValueTooLong> {
if let Some(standardized) = Self::from_wire(value) {
return Ok(standardized);
}
heapless::String::try_from(value).map(Self::Other).map_err(|_| ValueTooLong)
}
/// Whether this is one of the values the specification defines,
/// as opposed to a vendor's own.
pub fn is_standardized(&self) -> bool {
!matches!(self, Self::Other(_))
}
/// The spec's data type for this variable, as named in the device model tables (e.g. `decimal`, `OptionList`).
pub fn data_type(&self) -> Option<&'static str> {
match self {
Self::ACCurrent => Some("decimal"),
Self::ACPhaseSwitchingSupported => Some("boolean"),
Self::ACVoltage => Some("decimal"),
Self::Active => Some("boolean"),
Self::ActiveMonitoringBase => Some("OptionList"),
Self::ActiveMonitoringLevel => Some("integer"),
Self::ActiveNetworkProfile => Some("boolean"),
Self::ActiveTransactionId => Some("string"),
Self::AdditionalInfoItemsPerMessage => Some("integer"),
Self::AdditionalRootCertificateCheck => Some("boolean"),
Self::AllowEnergyTransferResumption => Some("boolean"),
Self::AllowNewSessionsPendingFirmwareUpdate => Some("boolean"),
Self::AllowReset => Some("boolean"),
Self::AllowSecurityProfileDowngrade => Some("boolean"),
Self::Angle => Some("decimal"),
Self::Attempts => Some("integer"),
Self::AuthorizeRemoteStart => Some("boolean"),
Self::AvailabilityState => Some("OptionList"),
Self::Available => Some("boolean"),
Self::BasicAuthPassword => Some("string"),
Self::BytesPerMessage => Some("integer"),
Self::CentralContractValidationAllowed => Some("boolean"),
Self::CertSigningRepeatTimes => Some("integer"),
Self::CertSigningWaitMinimum => Some("integer"),
Self::Certificate => Some("string"),
Self::CertificateEntries => Some("integer"),
Self::CertificateStatusSource => Some("string"),
Self::ChargeProtocol => Some("string"),
Self::ChargingCompleteBulk => Some("boolean"),
Self::ChargingCompleteFull => Some("boolean"),
Self::ChargingProfilePersistence => Some("boolean"),
Self::ChargingState => Some("OptionList"),
Self::ChargingTime => Some("decimal"),
Self::Color => Some("string"),
Self::CommunicationParent => Some("string"),
Self::Complete => Some("boolean"),
Self::ConditionsSupported => Some("boolean"),
Self::ConfigurationValueSize => Some("integer"),
Self::ConnectedTime => Some("decimal"),
Self::ConnectorType => Some("OptionList"),
Self::ContractCertificateInstallationEnabled => Some("boolean"),
Self::ContractValidationOffline => Some("boolean"),
Self::Count => Some("integer"),
Self::CountryName => Some("string"),
Self::Currency => Some("string"),
Self::CurrentImbalance => Some("decimal"),
Self::CustomImplementationEnabled => Some("boolean"),
Self::CustomTriggers => Some("MemberList"),
Self::DCCurrent => Some("decimal"),
Self::DCInputPhaseControl => Some("boolean"),
Self::DCVoltage => Some("decimal"),
Self::DataText => Some("string"),
Self::DateTime => Some("dateTime"),
Self::DepartureTime => Some("dateTime"),
Self::DisablePostAuthorize => Some("boolean"),
Self::DisableRemoteAuthorization => Some("boolean"),
Self::DisplayMessages => Some("integer"),
Self::ECVariant => Some("string"),
Self::EVConnectionTimeOut => Some("integer"),
Self::ElectricalParent => Some("string"),
Self::Enabled => Some("boolean"),
Self::Energy => Some("decimal"),
Self::EnergyCapacity => Some("decimal"),
Self::EnergyExport => Some("decimal"),
Self::EnergyExportRegister => Some("decimal"),
Self::EnergyImport => Some("decimal"),
Self::EnergyImportRegister => Some("decimal"),
Self::Entries => Some("integer"),
Self::ExternalConfigChangeDate => Some("DateTime"),
Self::ExternalConstraintsProfileDisallowed => Some("boolean"),
Self::ExternalControlSignalsEnabled => Some("boolean"),
Self::Fallback => Some("boolean"),
Self::FanSpeed => Some("decimal"),
Self::FieldLength => Some("integer"),
Self::FileTransferProtocols => Some("MemberList"),
Self::FirmwareVersion => Some("string"),
Self::Force => Some("decimal"),
Self::Formats => Some("MemberList"),
Self::Frequency => Some("decimal"),
Self::FrequencySchedule => Some("string"),
Self::FuseRating => Some("decimal"),
Self::HeartbeatInterval => Some("integer"),
Self::Height => Some("decimal"),
Self::Humidity => Some("decimal"),
Self::Hysteresis => Some("decimal"),
Self::ICCID => Some("string"),
Self::IMSI => Some("string"),
Self::ISO15118EvseId => Some("string"),
Self::IdToken => Some("string"),
Self::Identity => Some("string"),
Self::Impedance => Some("decimal"),
Self::Interval => Some("integer"),
Self::ItemsPerMessage => Some("integer"),
Self::Label => Some("string"),
Self::Language => Some("OptionList"),
Self::Length => Some("decimal"),
Self::LifeTime => Some("integer"),
Self::Light => Some("decimal"),
Self::LimitChangeSignificance => Some("decimal"),
Self::LocalAuthorizeOffline => Some("boolean"),
Self::LocalLoadBalancing => Some("decimal"),
Self::LocalPreAuthorize => Some("boolean"),
Self::LogicalParent => Some("string"),
Self::Manufacturer => Some("string"),
Self::MasterPassGroupId => Some("string"),
Self::MaxCertificateChainSize => Some("integer"),
Self::MaxEnergyOnInvalidId => Some("integer"),
Self::MaxExternalConstraintsId => Some("integer"),
Self::MaxPriceElements => Some("integer"),
Self::Measurands => Some("MemberList"),
Self::Message => Some("string"),
Self::MessageAttemptInterval => Some("integer"),
Self::MessageAttempts => Some("integer"),
Self::MessageTimeout => Some("integer"),
Self::MinimumStatusDuration => Some("integer"),
Self::Mode => Some("string"),
Self::Model => Some("string"),
Self::NetworkAddress => Some("string"),
Self::NetworkConfigurationPriority => Some("SequenceList"),
Self::NetworkProfileConnectionAttempts => Some("integer"),
Self::NextTimeOffsetTransitionDateTime => Some("DateTime"),
Self::NonEvseSpecific => Some("boolean"),
Self::NotificationMaxDelay => Some("integer"),
Self::NotifyChargingLimitWithSchedules => Some("boolean"),
Self::NtpServerUri => Some("string"),
Self::NtpSource => Some("OptionList"),
Self::OfflineQueuingSeverity => Some("integer"),
Self::OfflineTariffFallbackMessage => Some("string"),
Self::OfflineThreshold => Some("integer"),
Self::OfflineTxForUnknownIdEnabled => Some("boolean"),
Self::Operated => Some("boolean"),
Self::OperatingTimes => Some("string"),
Self::OrganizationName => Some("string"),
Self::Overload => Some("boolean"),
Self::Percent => Some("decimal"),
Self::PeriodsPerSchedule => Some("integer"),
Self::PhaseRotation => Some("string"),
Self::Phases3to1 => Some("boolean"),
Self::PhysicalParent => Some("string"),
Self::PnCEnabled => Some("boolean"),
Self::Policy => Some("OptionList"),
Self::PostChargingTime => Some("decimal"),
Self::Power => Some("decimal"),
Self::Present => Some("boolean"),
Self::Problem => Some("boolean"),
Self::ProfileStackLevel => Some("integer"),
Self::Protecting => Some("boolean"),
Self::ProtocolAgreed => Some("string"),
Self::ProtocolSupported => Some("string"),
Self::ProtocolSupportedByEV => Some("string"),
Self::PublicKey => Some("string"),
Self::PublicKeyWithSignedMeterValue => Some("boolean"),
Self::QueueAllMessages => Some("boolean"),
Self::RateUnit => Some("string"),
Self::RegisterValuesWithoutPhases => Some("boolean"),
Self::RemainingTimeBulk => Some("integer"),
Self::RemainingTimeFull => Some("integer"),
Self::ReportingValueSize => Some("integer"),
Self::RequestMeteringReceipt => Some("boolean"),
Self::ResetRetries => Some("integer"),
Self::ResumptionTimeout => Some("integer"),
Self::SampledMeasurands => Some("MemberList"),
Self::SamplingInterval => Some("decimal"),
Self::SeccId => Some("string"),
Self::SecurityProfile => Some("integer"),
Self::SendDuringIdle => Some("boolean"),
Self::SerialNumber => Some("string"),
Self::ServiceRenegotiationSupport => Some("boolean"),
Self::SignReadings => Some("boolean"),
Self::SignStartedReadings => Some("boolean"),
Self::SignUpdatedReadings => Some("boolean"),
Self::SignalStrength => Some("decimal"),
Self::SlotStatus => Some("OptionList"),
Self::SoC => Some("integer"),
Self::SoH => Some("integer"),
Self::State => Some("string"),
Self::StateOfCharge => Some("decimal"),
Self::StateOfChargeBulk => Some("decimal"),
Self::StopTxOnEVSideDisconnect => Some("boolean"),
Self::StopTxOnInvalidId => Some("boolean"),
Self::Storage => Some("integer"),
Self::SupplyPhases => Some("integer"),
Self::SupportsExpiryDateTime => Some("boolean"),
Self::Suspending => Some("boolean"),
Self::Suspension => Some("boolean"),
Self::TariffFallbackMessage => Some("string"),
Self::Temperature => Some("decimal"),
Self::Time => Some("dateTime"),
Self::TimeAdjustmentReportingThreshold => Some("integer"),
Self::TimeOffset => Some("string"),
Self::TimeSource => Some("SequenceList"),
Self::TimeZone => Some("string"),
Self::Timeout => Some("decimal"),
Self::Token => Some("string"),
Self::TokenType => Some("OptionList"),
Self::TotalCostFallbackMessage => Some("string"),
Self::Tries => Some("integer"),
Self::Tripped => Some("boolean"),
Self::TxBeforeAcceptedEnabled => Some("boolean"),
Self::TxEndedInterval => Some("integer"),
Self::TxEndedMeasurands => Some("MemberList"),
Self::TxStartPoint => Some("MemberList"),
Self::TxStartedMeasurands => Some("MemberList"),
Self::TxStopPoint => Some("MemberList"),
Self::TxUpdatedInterval => Some("integer"),
Self::TxUpdatedMeasurands => Some("MemberList"),
Self::UnlockOnEVSideDisconnect => Some("boolean"),
Self::V2GCertificateInstallationEnabled => Some("boolean"),
Self::VehicleCertificate => Some("string"),
Self::VehicleId => Some("string"),
Self::VersionDate => Some("dateTime"),
Self::VersionNumber => Some("string"),
Self::VoltageImbalance => Some("decimal"),
Self::VendorName => None,
Self::SupportedIdTokenType => None,
Self::SelftestActive => None,
Self::CHAdeMOProtocolNumber => None,
Self::VehicleStatus => None,
Self::DynamicControl => None,
Self::HighCurrentControl => None,
Self::HighVoltageControl => None,
Self::AutoManufacturerCode => None,
Self::VehicleID => None,
Self::BatteryCapacity => None,
Self::ValueSize => None,
Self::EvseId => None,
Self::MaxScheduleEntries => None,
Self::RequestedEnergyTransferMode => None,
Self::NotificationDelay => None,
Self::Capacity => None,
Self::MonitoringBase => None,
Self::MonitoringLevel => None,
Self::RetryBackOffRandomRange => None,
Self::RetryBackOffRepeatTimes => None,
Self::RetryBackOffWaitMinimum => None,
Self::WebSocketPingInterval => None,
Self::EnergyTransferResumptionRandomRange => None,
Self::OcppCsmsUrl => None,
Self::OcppInterface => None,
Self::OcppTransport => None,
Self::OcppVersion => None,
Self::CsmsRootCertificateHashAlgorithm => None,
Self::CsmsRootCertificateIssuerKeyHash => None,
Self::CsmsRootCertificateIssuerNameHash => None,
Self::CsmsRootCertificateSerialNumber => None,
Self::VpnEnabled => None,
Self::VpnType => None,
Self::VpnServer => None,
Self::VpnUser => None,
Self::VpnGroup => None,
Self::VpnPassword => None,
Self::VpnKey => None,
Self::ApnEnabled => None,
Self::Apn => None,
Self::ApnUserName => None,
Self::ApnPassword => None,
Self::SimPin => None,
Self::PreferredNetwork => None,
Self::UseOnlyPreferredNetwork => None,
Self::ApnAuthentication => None,
Self::Other(_) => None,
}
}
/// The variable's unit, where the spec states one.
pub fn unit(&self) -> Option<&'static str> {
match self {
Self::ACCurrent => Some("A"),
Self::ACPhaseSwitchingSupported => None,
Self::ACVoltage => Some("V"),
Self::Active => None,
Self::ActiveMonitoringBase => None,
Self::ActiveMonitoringLevel => None,
Self::ActiveNetworkProfile => None,
Self::ActiveTransactionId => None,
Self::AdditionalInfoItemsPerMessage => None,
Self::AdditionalRootCertificateCheck => None,
Self::AllowEnergyTransferResumption => None,
Self::AllowNewSessionsPendingFirmwareUpdate => None,
Self::AllowReset => None,
Self::AllowSecurityProfileDowngrade => None,
Self::Angle => Some("Deg"),
Self::Attempts => None,
Self::AuthorizeRemoteStart => None,
Self::AvailabilityState => None,
Self::Available => None,
Self::BasicAuthPassword => None,
Self::BytesPerMessage => None,
Self::CentralContractValidationAllowed => None,
Self::CertSigningRepeatTimes => None,
Self::CertSigningWaitMinimum => None,
Self::Certificate => None,
Self::CertificateEntries => None,
Self::CertificateStatusSource => None,
Self::ChargeProtocol => None,
Self::ChargingCompleteBulk => None,
Self::ChargingCompleteFull => None,
Self::ChargingProfilePersistence => None,
Self::ChargingState => None,
Self::ChargingTime => Some("s"),
Self::Color => None,
Self::CommunicationParent => None,
Self::Complete => None,
Self::ConditionsSupported => None,
Self::ConfigurationValueSize => None,
Self::ConnectedTime => Some("s"),
Self::ConnectorType => None,
Self::ContractCertificateInstallationEnabled => None,
Self::ContractValidationOffline => None,
Self::Count => None,
Self::CountryName => None,
Self::Currency => None,
Self::CurrentImbalance => Some("Percent"),
Self::CustomImplementationEnabled => None,
Self::CustomTriggers => None,
Self::DCCurrent => Some("A"),
Self::DCInputPhaseControl => None,
Self::DCVoltage => Some("V"),
Self::DataText => None,
Self::DateTime => None,
Self::DepartureTime => None,
Self::DisablePostAuthorize => None,
Self::DisableRemoteAuthorization => None,
Self::DisplayMessages => None,
Self::ECVariant => None,
Self::EVConnectionTimeOut => Some("s"),
Self::ElectricalParent => None,
Self::Enabled => None,
Self::Energy => Some("Wh"),
Self::EnergyCapacity => Some("Wh"),
Self::EnergyExport => Some("Wh"),
Self::EnergyExportRegister => Some("Wh"),
Self::EnergyImport => Some("Wh"),
Self::EnergyImportRegister => Some("Wh"),
Self::Entries => None,
Self::ExternalConfigChangeDate => None,
Self::ExternalConstraintsProfileDisallowed => None,
Self::ExternalControlSignalsEnabled => None,
Self::Fallback => None,
Self::FanSpeed => Some("RPM"),
Self::FieldLength => None,
Self::FileTransferProtocols => None,
Self::FirmwareVersion => None,
Self::Force => Some("N"),
Self::Formats => None,
Self::Frequency => Some("Hz"),
Self::FrequencySchedule => None,
Self::FuseRating => Some("A"),
Self::HeartbeatInterval => Some("s"),
Self::Height => Some("m"),
Self::Humidity => Some("RH"),
Self::Hysteresis => Some("Percent"),
Self::ICCID => None,
Self::IMSI => None,
Self::ISO15118EvseId => None,
Self::IdToken => None,
Self::Identity => None,
Self::Impedance => Some("Ohm"),
Self::Interval => Some("s"),
Self::ItemsPerMessage => None,
Self::Label => None,
Self::Language => None,
Self::Length => Some("m"),
Self::LifeTime => Some("s"),
Self::Light => Some("lx"),
Self::LimitChangeSignificance => None,
Self::LocalAuthorizeOffline => None,
Self::LocalLoadBalancing => None,
Self::LocalPreAuthorize => None,
Self::LogicalParent => None,
Self::Manufacturer => None,
Self::MasterPassGroupId => None,
Self::MaxCertificateChainSize => None,
Self::MaxEnergyOnInvalidId => Some("Wh"),
Self::MaxExternalConstraintsId => None,
Self::MaxPriceElements => None,
Self::Measurands => None,
Self::Message => None,
Self::MessageAttemptInterval => Some("s"),
Self::MessageAttempts => None,
Self::MessageTimeout => Some("s"),
Self::MinimumStatusDuration => Some("s"),
Self::Mode => None,
Self::Model => None,
Self::NetworkAddress => None,
Self::NetworkConfigurationPriority => None,
Self::NetworkProfileConnectionAttempts => None,
Self::NextTimeOffsetTransitionDateTime => None,
Self::NonEvseSpecific => None,
Self::NotificationMaxDelay => Some("s"),
Self::NotifyChargingLimitWithSchedules => None,
Self::NtpServerUri => None,
Self::NtpSource => None,
Self::OfflineQueuingSeverity => None,
Self::OfflineTariffFallbackMessage => None,
Self::OfflineThreshold => Some("s"),
Self::OfflineTxForUnknownIdEnabled => None,
Self::Operated => None,
Self::OperatingTimes => None,
Self::OrganizationName => None,
Self::Overload => None,
Self::Percent => Some("Percent"),
Self::PeriodsPerSchedule => None,
Self::PhaseRotation => None,
Self::Phases3to1 => None,
Self::PhysicalParent => None,
Self::PnCEnabled => None,
Self::Policy => None,
Self::PostChargingTime => Some("s"),
Self::Power => Some("W,kW"),
Self::Present => None,
Self::Problem => None,
Self::ProfileStackLevel => None,
Self::Protecting => None,
Self::ProtocolAgreed => None,
Self::ProtocolSupported => None,
Self::ProtocolSupportedByEV => None,
Self::PublicKey => None,
Self::PublicKeyWithSignedMeterValue => None,
Self::QueueAllMessages => None,
Self::RateUnit => None,
Self::RegisterValuesWithoutPhases => None,
Self::RemainingTimeBulk => Some("s"),
Self::RemainingTimeFull => Some("s"),
Self::ReportingValueSize => None,
Self::RequestMeteringReceipt => None,
Self::ResetRetries => None,
Self::ResumptionTimeout => Some("s"),
Self::SampledMeasurands => None,
Self::SamplingInterval => Some("s"),
Self::SeccId => None,
Self::SecurityProfile => None,
Self::SendDuringIdle => None,
Self::SerialNumber => None,
Self::ServiceRenegotiationSupport => None,
Self::SignReadings => None,
Self::SignStartedReadings => None,
Self::SignUpdatedReadings => None,
Self::SignalStrength => Some("dBm"),
Self::SlotStatus => None,
Self::SoC => Some("Percent"),
Self::SoH => Some("Percent"),
Self::State => None,
Self::StateOfCharge => Some("Percent"),
Self::StateOfChargeBulk => Some("Percent"),
Self::StopTxOnEVSideDisconnect => None,
Self::StopTxOnInvalidId => None,
Self::Storage => Some("B"),
Self::SupplyPhases => None,
Self::SupportsExpiryDateTime => None,
Self::Suspending => None,
Self::Suspension => None,
Self::TariffFallbackMessage => None,
Self::Temperature => Some("Celsius, Fahrenheit"),
Self::Time => None,
Self::TimeAdjustmentReportingThreshold => Some("s"),
Self::TimeOffset => None,
Self::TimeSource => None,
Self::TimeZone => None,
Self::Timeout => Some("s"),
Self::Token => None,
Self::TokenType => None,
Self::TotalCostFallbackMessage => None,
Self::Tries => None,
Self::Tripped => None,
Self::TxBeforeAcceptedEnabled => None,
Self::TxEndedInterval => Some("s"),
Self::TxEndedMeasurands => None,
Self::TxStartPoint => None,
Self::TxStartedMeasurands => None,
Self::TxStopPoint => None,
Self::TxUpdatedInterval => Some("s"),
Self::TxUpdatedMeasurands => None,
Self::UnlockOnEVSideDisconnect => None,
Self::V2GCertificateInstallationEnabled => None,
Self::VehicleCertificate => None,
Self::VehicleId => None,
Self::VersionDate => None,
Self::VersionNumber => None,
Self::VoltageImbalance => Some("Percent"),
Self::VendorName => None,
Self::SupportedIdTokenType => None,
Self::SelftestActive => None,
Self::CHAdeMOProtocolNumber => None,
Self::VehicleStatus => None,
Self::DynamicControl => None,
Self::HighCurrentControl => None,
Self::HighVoltageControl => None,
Self::AutoManufacturerCode => None,
Self::VehicleID => None,
Self::BatteryCapacity => None,
Self::ValueSize => None,
Self::EvseId => None,
Self::MaxScheduleEntries => None,
Self::RequestedEnergyTransferMode => None,
Self::NotificationDelay => None,
Self::Capacity => None,
Self::MonitoringBase => None,
Self::MonitoringLevel => None,
Self::RetryBackOffRandomRange => None,
Self::RetryBackOffRepeatTimes => None,
Self::RetryBackOffWaitMinimum => None,
Self::WebSocketPingInterval => None,
Self::EnergyTransferResumptionRandomRange => None,
Self::OcppCsmsUrl => None,
Self::OcppInterface => None,
Self::OcppTransport => None,
Self::OcppVersion => None,
Self::CsmsRootCertificateHashAlgorithm => None,
Self::CsmsRootCertificateIssuerKeyHash => None,
Self::CsmsRootCertificateIssuerNameHash => None,
Self::CsmsRootCertificateSerialNumber => None,
Self::VpnEnabled => None,
Self::VpnType => None,
Self::VpnServer => None,
Self::VpnUser => None,
Self::VpnGroup => None,
Self::VpnPassword => None,
Self::VpnKey => None,
Self::ApnEnabled => None,
Self::Apn => None,
Self::ApnUserName => None,
Self::ApnPassword => None,
Self::SimPin => None,
Self::PreferredNetwork => None,
Self::UseOnlyPreferredNetwork => None,
Self::ApnAuthentication => None,
Self::Other(_) => None,
}
}
}
impl core::fmt::Display for VariableName {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl core::str::FromStr for VariableName {
type Err = ValueTooLong;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_wire_or_other(value)
}
}
impl PartialEq for VariableName {
fn eq(&self, other: &Self) -> bool {
self.as_str() == other.as_str()
}
}
impl Eq for VariableName {}
impl core::hash::Hash for VariableName {
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
self.as_str().hash(state);
}
}
impl PartialOrd for VariableName {
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for VariableName {
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
self.as_str().cmp(other.as_str())
}
}
#[cfg(feature = "serde")]
impl serde::Serialize for VariableName {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.as_str())
}
}
#[cfg(feature = "serde")]
impl<'de> serde::Deserialize<'de> for VariableName {
fn deserialize<D: serde::Deserializer<'de>>(
deserializer: D,
) -> Result<Self, D::Error> {
struct Visitor;
impl<'v> serde::de::Visitor<'v> for Visitor {
type Value = VariableName;
fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("a VariableName string")
}
fn visit_str<E: serde::de::Error>(
self,
value: &str,
) -> Result<Self::Value, E> {
VariableName::from_wire_or_other(value).map_err(serde::de::Error::custom)
}
}
deserializer.deserialize_str(Visitor)
}
}
/// Standardized `SecurityEventNotificationRequest.type` values.
///
/// A *closed* set: it holds only the values the specification
/// defines. The wire field is a string, so a deployment can still
/// send something else -- `from_wire` returns `None` for that,
/// which is not by itself a protocol error.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SecurityEvent {
/// The Charging Station firmware is updated
FirmwareUpdated,
/// The authentication credentials provided by the Charging Station were rejected by the CSMS
FailedToAuthenticateAtCsms,
/// The authentication credentials provided by the CSMS were rejected by the Charging Station
CsmsFailedToAuthenticate,
/// The system time on the Charging Station was changed more than `ClockCtrlr.TimeAdjustmentReportingThreshold` seconds
SettingSystemTime,
/// The Charging Station has booted
StartupOfTheDevice,
/// The Charging Station was rebooted or reset
ResetOrReboot,
/// The security log was cleared
SecurityLogWasCleared,
/// Security parameters, such as keys or the security profile used, were changed
ReconfigurationOfSecurityParameters,
/// The Flash or RAM memory of the Charging Station is getting full
MemoryExhaustion,
/// The Charging Station has received messages that are not valid OCPP messages, if signed messages, signage invalid/incorrect
InvalidMessages,
/// The Charging Station has received a replayed message (other than the CSMS trying to resend a message because it there was for example a network problem)
AttemptedReplayAttacks,
/// The physical tamper detection sensor was triggered
TamperDetectionActivated,
/// The firmware signature is not valid
InvalidFirmwareSignature,
/// The certificate used to verify the firmware signature is not valid
InvalidFirmwareSigningCertificate,
/// The certificate that the CSMS uses was not valid or could not be verified
InvalidCsmsCertificate,
/// The certificate sent to the Charging Station using the CertificateSignedRequest message is not a valid certificate
InvalidChargingStationCertificate,
/// The Charging Station discarded the renewed client certificate, because it was unable to successfully establish a connection using it.
DiscardedRenewedClientCertificate,
/// The TLS version used by the CSMS is lower than 1.2 and is not allowed by the security specification
InvalidTLSVersion,
/// The CSMS did only allow connections using TLS cipher suites that are not allowed by the security specification
InvalidTLSCipherSuite,
/// Successful login to the local maintenance interface. It is recommended to include information like the user identification and the origin of the login attempt, which can be an ip-address or a touch screen for example, to the techInfo field. For this the following format is strongly recommended: '{\'user\': \'...\', \'origin\': \'...\'}'
MaintenanceLoginAccepted,
/// Failed login attempt to the local maintenance interface. It is recommended to include information like the user identification and the origin of the login attempt, which can be an ip-address or a touch screen for example, to the techInfo field. For this the following format is strongly recommended: '{\'user\': \'...\', \'origin\': \'...\'}'
MaintenanceLoginFailed,
}
impl SecurityEvent {
/// Every value this version's specification defines (21), in spec order.
pub const ALL: &'static [Self] = &[
Self::FirmwareUpdated,
Self::FailedToAuthenticateAtCsms,
Self::CsmsFailedToAuthenticate,
Self::SettingSystemTime,
Self::StartupOfTheDevice,
Self::ResetOrReboot,
Self::SecurityLogWasCleared,
Self::ReconfigurationOfSecurityParameters,
Self::MemoryExhaustion,
Self::InvalidMessages,
Self::AttemptedReplayAttacks,
Self::TamperDetectionActivated,
Self::InvalidFirmwareSignature,
Self::InvalidFirmwareSigningCertificate,
Self::InvalidCsmsCertificate,
Self::InvalidChargingStationCertificate,
Self::DiscardedRenewedClientCertificate,
Self::InvalidTLSVersion,
Self::InvalidTLSCipherSuite,
Self::MaintenanceLoginAccepted,
Self::MaintenanceLoginFailed,
];
/// This value as it appears on the wire.
pub const fn as_str(&self) -> &'static str {
match self {
Self::FirmwareUpdated => "FirmwareUpdated",
Self::FailedToAuthenticateAtCsms => "FailedToAuthenticateAtCsms",
Self::CsmsFailedToAuthenticate => "CsmsFailedToAuthenticate",
Self::SettingSystemTime => "SettingSystemTime",
Self::StartupOfTheDevice => "StartupOfTheDevice",
Self::ResetOrReboot => "ResetOrReboot",
Self::SecurityLogWasCleared => "SecurityLogWasCleared",
Self::ReconfigurationOfSecurityParameters => {
"ReconfigurationOfSecurityParameters"
}
Self::MemoryExhaustion => "MemoryExhaustion",
Self::InvalidMessages => "InvalidMessages",
Self::AttemptedReplayAttacks => "AttemptedReplayAttacks",
Self::TamperDetectionActivated => "TamperDetectionActivated",
Self::InvalidFirmwareSignature => "InvalidFirmwareSignature",
Self::InvalidFirmwareSigningCertificate => {
"InvalidFirmwareSigningCertificate"
}
Self::InvalidCsmsCertificate => "InvalidCsmsCertificate",
Self::InvalidChargingStationCertificate => {
"InvalidChargingStationCertificate"
}
Self::DiscardedRenewedClientCertificate => {
"DiscardedRenewedClientCertificate"
}
Self::InvalidTLSVersion => "InvalidTLSVersion",
Self::InvalidTLSCipherSuite => "InvalidTLSCipherSuite",
Self::MaintenanceLoginAccepted => "MaintenanceLoginAccepted",
Self::MaintenanceLoginFailed => "MaintenanceLoginFailed",
}
}
/// Parses a wire value, returning `None` for values the
/// specification doesn't define (e.g. a vendor's own).
pub fn from_wire(value: &str) -> Option<Self> {
match value {
"FirmwareUpdated" => Some(Self::FirmwareUpdated),
"FailedToAuthenticateAtCsms" => Some(Self::FailedToAuthenticateAtCsms),
"CsmsFailedToAuthenticate" => Some(Self::CsmsFailedToAuthenticate),
"SettingSystemTime" => Some(Self::SettingSystemTime),
"StartupOfTheDevice" => Some(Self::StartupOfTheDevice),
"ResetOrReboot" => Some(Self::ResetOrReboot),
"SecurityLogWasCleared" => Some(Self::SecurityLogWasCleared),
"ReconfigurationOfSecurityParameters" => {
Some(Self::ReconfigurationOfSecurityParameters)
}
"MemoryExhaustion" => Some(Self::MemoryExhaustion),
"InvalidMessages" => Some(Self::InvalidMessages),
"AttemptedReplayAttacks" => Some(Self::AttemptedReplayAttacks),
"TamperDetectionActivated" => Some(Self::TamperDetectionActivated),
"InvalidFirmwareSignature" => Some(Self::InvalidFirmwareSignature),
"InvalidFirmwareSigningCertificate" => {
Some(Self::InvalidFirmwareSigningCertificate)
}
"InvalidCsmsCertificate" => Some(Self::InvalidCsmsCertificate),
"InvalidChargingStationCertificate" => {
Some(Self::InvalidChargingStationCertificate)
}
"DiscardedRenewedClientCertificate" => {
Some(Self::DiscardedRenewedClientCertificate)
}
"InvalidTLSVersion" => Some(Self::InvalidTLSVersion),
"InvalidTLSCipherSuite" => Some(Self::InvalidTLSCipherSuite),
"MaintenanceLoginAccepted" => Some(Self::MaintenanceLoginAccepted),
"MaintenanceLoginFailed" => Some(Self::MaintenanceLoginFailed),
_ => None,
}
}
/// Whether the spec marks this event critical, meaning it must be reported to the CSMS even when not explicitly monitored.
pub const fn is_critical(&self) -> bool {
match self {
Self::FirmwareUpdated => true,
Self::FailedToAuthenticateAtCsms => false,
Self::CsmsFailedToAuthenticate => false,
Self::SettingSystemTime => true,
Self::StartupOfTheDevice => true,
Self::ResetOrReboot => true,
Self::SecurityLogWasCleared => true,
Self::ReconfigurationOfSecurityParameters => false,
Self::MemoryExhaustion => true,
Self::InvalidMessages => false,
Self::AttemptedReplayAttacks => false,
Self::TamperDetectionActivated => true,
Self::InvalidFirmwareSignature => true,
Self::InvalidFirmwareSigningCertificate => true,
Self::InvalidCsmsCertificate => true,
Self::InvalidChargingStationCertificate => true,
Self::DiscardedRenewedClientCertificate => true,
Self::InvalidTLSVersion => true,
Self::InvalidTLSCipherSuite => true,
Self::MaintenanceLoginAccepted => true,
Self::MaintenanceLoginFailed => true,
}
}
}
impl core::fmt::Display for SecurityEvent {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl core::str::FromStr for SecurityEvent {
type Err = UnknownValue;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_wire(value).ok_or(UnknownValue)
}
}
/// Standardized `StatusInfo.reasonCode` values.
///
/// A *closed* set: it holds only the values the specification
/// defines. The wire field is a string, so a deployment can still
/// send something else -- `from_wire` returns `None` for that,
/// which is not by itself a protocol error.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ReasonCode {
/// A charging profile with same _stackLevel - chargingProfilePurpose_ combination already exists on the Charging Station and has an overlapping validity period.
///
/// Spec group: Charging Profiles.
DuplicateProfile,
/// Provided _chargingProfile_ contains invalid elements.
///
/// Spec group: Charging Profiles.
InvalidProfile,
/// Provided _chargingProfile_ has an id that is within an invalid range.
///
/// Spec group: Charging Profiles.
InvalidProfileId,
/// Provided _chargingSchedule_ contains invalid elements.
///
/// Spec group: Charging Profiles.
InvalidSchedule,
/// Provided value for _stackLevel_ is invalid.
///
/// Spec group: Charging Profiles.
InvalidStackLevel,
/// Phase selection for a DC EVSE is not supported
///
/// Spec group: Charging Profiles.
NoPhaseForDC,
/// Phase conflict between applicable charging profiles
///
/// Spec group: Charging Profiles.
PhaseConflict,
/// A charging profile of the same purpose is submitted too frequently
///
/// Spec group: Charging Profiles.
RateLimitExceeded,
/// The requested charging profile kind is not supported
///
/// Spec group: Charging Profiles.
UnsupportedKind,
/// The requested charging profile purpose is not supported
///
/// Spec group: Charging Profiles.
UnsupportedPurpose,
/// A _chargingRateUnit_ is provided that is not supported.
///
/// Spec group: Charging Profiles.
UnsupportedRateUnit,
/// BootNotification of Charging Station has not (yet) been accepted by CSMS.
///
/// Spec group: Charging Station.
CSNotAccepted,
/// The connector has its own fixed cable that cannot be unlocked.
///
/// Spec group: Charging Station.
FixedCable,
/// No cable is connected at this time.
///
/// Spec group: Charging Station.
NoCable,
/// Connector Id is not known on EVSE
///
/// Spec group: Charging Station.
UnknownConnectorId,
/// Connector type is not known on EVSE
///
/// Spec group: Charging Station.
UnknownConnectorType,
/// EVSE is not known on Charging Stations
///
/// Spec group: Charging Station.
UnknownEvse,
/// Some values in NetworkConfiguration instance are invalid
///
/// Spec group: Network Configuration.
InvalidNetworkConf,
/// Security profile downgrade is not allowed
///
/// Spec group: Network Configuration.
NoSecurityDowngrade,
/// A _requestId_ is provided, that has already been used for this type of request.
///
/// Spec group: Miscellaneous.
DuplicateRequestId,
/// Message should not be sent at this moment in current scenario.
///
/// Spec group: Miscellaneous.
InvalidMessageSeq,
/// Information needed for operation is missing from Device Model
///
/// Spec group: Miscellaneous.
MissingDevModelInfo,
/// No error has occurred, but some extra information is in _additionalInfo_ .
///
/// Spec group: Miscellaneous.
NoError,
/// No object(s) found that match a provided ID or criteria.
///
/// Spec group: Miscellaneous.
NotFound,
/// No reason is specified, but some extra information is in _additionalInfo_
///
/// Spec group: Miscellaneous.
Unspecified,
/// This request is not supported.
///
/// Spec group: Miscellaneous.
UnsupportedRequest,
/// Operation is not possible, because a firmware update is in progress.
///
/// Spec group: Operations and Permissions.
FwUpdateInProgress,
/// Feature is not enabled.
///
/// Spec group: Operations and Permissions.
NotEnabled,
/// Targeted variable is read-only and cannot be set.
///
/// Spec group: Operations and Permissions.
ReadOnly,
/// Targeted variable is write-only and cannot be read.
///
/// Spec group: Operations and Permissions.
WriteOnly,
/// Provided CSR is invalid
///
/// Spec group: Security.
InvalidCSR,
/// Provided certificate is invalid.
///
/// Spec group: Security.
InvalidCertificate,
/// Provided URL is invalid.
///
/// Spec group: Security.
InvalidURL,
/// HTTP Redirection is not allowed
///
/// Spec group: Security.
RedirectNotAllowed,
/// Operation cannot be completed due to an internal error.
///
/// Spec group: System Errors.
InternalError,
/// Operation not possible, because system does not have enough memory.
///
/// Spec group: System Errors.
OutOfMemory,
/// Operation not possible, because system does not have enough storage.
///
/// Spec group: System Errors.
OutOfStorage,
/// Provided _idToken_ is not valid.
///
/// Spec group: Transactions.
InvalidIdToken,
/// A transaction is in progress.
///
/// Spec group: Transactions.
TxInProgress,
/// There is no such transaction.
///
/// Spec group: Transactions.
TxNotFound,
/// A transaction had already started (e.g. due to cable being plugged in).
///
/// Spec group: Transactions.
TxStarted,
/// An invalid value has been provided.
///
/// Spec group: Values and Ranges.
InvalidValue,
/// A parameter that is required for the request is missing.
///
/// Spec group: Values and Ranges.
MissingParam,
/// Provided element is too large to handle.
///
/// Spec group: Values and Ranges.
TooLargeElement,
/// Too many elements have been provided.
///
/// Spec group: Values and Ranges.
TooManyElements,
/// A parameter was provided that is not supported.
///
/// Spec group: Values and Ranges.
UnsupportedParam,
/// Provided value is out of range.
///
/// Spec group: Values and Ranges.
ValueOutOfRange,
/// Provided value is not greater than zero.
///
/// Spec group: Values and Ranges.
ValuePositiveOnly,
/// Provided value is too high.
///
/// Spec group: Values and Ranges.
ValueTooHigh,
/// Provided value is too low.
///
/// Spec group: Values and Ranges.
ValueTooLow,
/// Provided value cannot be zero.
///
/// Spec group: Values and Ranges.
ValueZeroNotAllowed,
}
impl ReasonCode {
/// Every value this version's specification defines (51), in spec order.
pub const ALL: &'static [Self] = &[
Self::DuplicateProfile,
Self::InvalidProfile,
Self::InvalidProfileId,
Self::InvalidSchedule,
Self::InvalidStackLevel,
Self::NoPhaseForDC,
Self::PhaseConflict,
Self::RateLimitExceeded,
Self::UnsupportedKind,
Self::UnsupportedPurpose,
Self::UnsupportedRateUnit,
Self::CSNotAccepted,
Self::FixedCable,
Self::NoCable,
Self::UnknownConnectorId,
Self::UnknownConnectorType,
Self::UnknownEvse,
Self::InvalidNetworkConf,
Self::NoSecurityDowngrade,
Self::DuplicateRequestId,
Self::InvalidMessageSeq,
Self::MissingDevModelInfo,
Self::NoError,
Self::NotFound,
Self::Unspecified,
Self::UnsupportedRequest,
Self::FwUpdateInProgress,
Self::NotEnabled,
Self::ReadOnly,
Self::WriteOnly,
Self::InvalidCSR,
Self::InvalidCertificate,
Self::InvalidURL,
Self::RedirectNotAllowed,
Self::InternalError,
Self::OutOfMemory,
Self::OutOfStorage,
Self::InvalidIdToken,
Self::TxInProgress,
Self::TxNotFound,
Self::TxStarted,
Self::InvalidValue,
Self::MissingParam,
Self::TooLargeElement,
Self::TooManyElements,
Self::UnsupportedParam,
Self::ValueOutOfRange,
Self::ValuePositiveOnly,
Self::ValueTooHigh,
Self::ValueTooLow,
Self::ValueZeroNotAllowed,
];
/// This value as it appears on the wire.
pub const fn as_str(&self) -> &'static str {
match self {
Self::DuplicateProfile => "DuplicateProfile",
Self::InvalidProfile => "InvalidProfile",
Self::InvalidProfileId => "InvalidProfileId",
Self::InvalidSchedule => "InvalidSchedule",
Self::InvalidStackLevel => "InvalidStackLevel",
Self::NoPhaseForDC => "NoPhaseForDC",
Self::PhaseConflict => "PhaseConflict",
Self::RateLimitExceeded => "RateLimitExceeded",
Self::UnsupportedKind => "UnsupportedKind",
Self::UnsupportedPurpose => "UnsupportedPurpose",
Self::UnsupportedRateUnit => "UnsupportedRateUnit",
Self::CSNotAccepted => "CSNotAccepted",
Self::FixedCable => "FixedCable",
Self::NoCable => "NoCable",
Self::UnknownConnectorId => "UnknownConnectorId",
Self::UnknownConnectorType => "UnknownConnectorType",
Self::UnknownEvse => "UnknownEvse",
Self::InvalidNetworkConf => "InvalidNetworkConf",
Self::NoSecurityDowngrade => "NoSecurityDowngrade",
Self::DuplicateRequestId => "DuplicateRequestId",
Self::InvalidMessageSeq => "InvalidMessageSeq",
Self::MissingDevModelInfo => "MissingDevModelInfo",
Self::NoError => "NoError",
Self::NotFound => "NotFound",
Self::Unspecified => "Unspecified",
Self::UnsupportedRequest => "UnsupportedRequest",
Self::FwUpdateInProgress => "FwUpdateInProgress",
Self::NotEnabled => "NotEnabled",
Self::ReadOnly => "ReadOnly",
Self::WriteOnly => "WriteOnly",
Self::InvalidCSR => "InvalidCSR",
Self::InvalidCertificate => "InvalidCertificate",
Self::InvalidURL => "InvalidURL",
Self::RedirectNotAllowed => "RedirectNotAllowed",
Self::InternalError => "InternalError",
Self::OutOfMemory => "OutOfMemory",
Self::OutOfStorage => "OutOfStorage",
Self::InvalidIdToken => "InvalidIdToken",
Self::TxInProgress => "TxInProgress",
Self::TxNotFound => "TxNotFound",
Self::TxStarted => "TxStarted",
Self::InvalidValue => "InvalidValue",
Self::MissingParam => "MissingParam",
Self::TooLargeElement => "TooLargeElement",
Self::TooManyElements => "TooManyElements",
Self::UnsupportedParam => "UnsupportedParam",
Self::ValueOutOfRange => "ValueOutOfRange",
Self::ValuePositiveOnly => "ValuePositiveOnly",
Self::ValueTooHigh => "ValueTooHigh",
Self::ValueTooLow => "ValueTooLow",
Self::ValueZeroNotAllowed => "ValueZeroNotAllowed",
}
}
/// Parses a wire value, returning `None` for values the
/// specification doesn't define (e.g. a vendor's own).
pub fn from_wire(value: &str) -> Option<Self> {
match value {
"DuplicateProfile" => Some(Self::DuplicateProfile),
"InvalidProfile" => Some(Self::InvalidProfile),
"InvalidProfileId" => Some(Self::InvalidProfileId),
"InvalidSchedule" => Some(Self::InvalidSchedule),
"InvalidStackLevel" => Some(Self::InvalidStackLevel),
"NoPhaseForDC" => Some(Self::NoPhaseForDC),
"PhaseConflict" => Some(Self::PhaseConflict),
"RateLimitExceeded" => Some(Self::RateLimitExceeded),
"UnsupportedKind" => Some(Self::UnsupportedKind),
"UnsupportedPurpose" => Some(Self::UnsupportedPurpose),
"UnsupportedRateUnit" => Some(Self::UnsupportedRateUnit),
"CSNotAccepted" => Some(Self::CSNotAccepted),
"FixedCable" => Some(Self::FixedCable),
"NoCable" => Some(Self::NoCable),
"UnknownConnectorId" => Some(Self::UnknownConnectorId),
"UnknownConnectorType" => Some(Self::UnknownConnectorType),
"UnknownEvse" => Some(Self::UnknownEvse),
"InvalidNetworkConf" => Some(Self::InvalidNetworkConf),
"NoSecurityDowngrade" => Some(Self::NoSecurityDowngrade),
"DuplicateRequestId" => Some(Self::DuplicateRequestId),
"InvalidMessageSeq" => Some(Self::InvalidMessageSeq),
"MissingDevModelInfo" => Some(Self::MissingDevModelInfo),
"NoError" => Some(Self::NoError),
"NotFound" => Some(Self::NotFound),
"Unspecified" => Some(Self::Unspecified),
"UnsupportedRequest" => Some(Self::UnsupportedRequest),
"FwUpdateInProgress" => Some(Self::FwUpdateInProgress),
"NotEnabled" => Some(Self::NotEnabled),
"ReadOnly" => Some(Self::ReadOnly),
"WriteOnly" => Some(Self::WriteOnly),
"InvalidCSR" => Some(Self::InvalidCSR),
"InvalidCertificate" => Some(Self::InvalidCertificate),
"InvalidURL" => Some(Self::InvalidURL),
"RedirectNotAllowed" => Some(Self::RedirectNotAllowed),
"InternalError" => Some(Self::InternalError),
"OutOfMemory" => Some(Self::OutOfMemory),
"OutOfStorage" => Some(Self::OutOfStorage),
"InvalidIdToken" => Some(Self::InvalidIdToken),
"TxInProgress" => Some(Self::TxInProgress),
"TxNotFound" => Some(Self::TxNotFound),
"TxStarted" => Some(Self::TxStarted),
"InvalidValue" => Some(Self::InvalidValue),
"MissingParam" => Some(Self::MissingParam),
"TooLargeElement" => Some(Self::TooLargeElement),
"TooManyElements" => Some(Self::TooManyElements),
"UnsupportedParam" => Some(Self::UnsupportedParam),
"ValueOutOfRange" => Some(Self::ValueOutOfRange),
"ValuePositiveOnly" => Some(Self::ValuePositiveOnly),
"ValueTooHigh" => Some(Self::ValueTooHigh),
"ValueTooLow" => Some(Self::ValueTooLow),
"ValueZeroNotAllowed" => Some(Self::ValueZeroNotAllowed),
_ => None,
}
}
/// The message(s) the spec expects this reason code on.
pub const fn typically_used_for(&self) -> Option<&'static str> {
match self {
Self::DuplicateProfile => Some("SetChargingProfile"),
Self::InvalidProfile => Some("SetChargingProfile, RequestStartTransaction"),
Self::InvalidProfileId => Some("SetChargingProfile, RequestStartTransaction"),
Self::InvalidSchedule => Some("SetChargingProfile, RequestStartTransaction"),
Self::InvalidStackLevel => Some("SetChargingProfile"),
Self::NoPhaseForDC => Some("SetChargingProfile"),
Self::PhaseConflict => Some("SetChargingProfile"),
Self::RateLimitExceeded => Some("SetChargingProfile"),
Self::UnsupportedKind => Some("SetChargingProfile"),
Self::UnsupportedPurpose => Some("SetChargingProfile"),
Self::UnsupportedRateUnit => Some("SetChargingProfile"),
Self::CSNotAccepted => {
Some("RequestStartTransaction, RequestStopTransaction")
}
Self::FixedCable => Some("UnlockConnector"),
Self::NoCable => Some("UnlockConnector"),
Self::UnknownConnectorId => Some("ChangeAvailability, UnlockConnector"),
Self::UnknownConnectorType => Some("ReserveNow"),
Self::UnknownEvse => {
Some("ChangeAvailability, ReserveNow, RequestStartTransaction")
}
Self::InvalidNetworkConf => {
Some(
"SetVariablesRequest of NetworkConfigurationPriority,SetNetworkProfileRequest",
)
}
Self::NoSecurityDowngrade => {
Some("SetVariablesRequest of SecurityProfile, SetNetworkProfileRequest")
}
Self::DuplicateRequestId => {
Some("UpdateFirmware, PublishFirmware and requests for reports.")
}
Self::InvalidMessageSeq => {
Some("(generic), SetChargingProfile with ISO15118")
}
Self::MissingDevModelInfo => Some("(generic)"),
Self::NoError => Some("(generic)"),
Self::NotFound => {
Some(
"ClearVariableMonitoring, CustomerInformation, GetChargingProfiles, GetDisplayMessages, GetInstalledCertificateIds, GetReport",
)
}
Self::Unspecified => Some("(generic)"),
Self::UnsupportedRequest => Some("(generic)"),
Self::FwUpdateInProgress => Some("Reset"),
Self::NotEnabled => Some("ClearCache"),
Self::ReadOnly => Some("SetVariables"),
Self::WriteOnly => Some("GetVariables"),
Self::InvalidCSR => Some("SignCertificate"),
Self::InvalidCertificate => Some("CertificateSigned, InstallCertificate"),
Self::InvalidURL => Some("UpdateFirmware, PublishFirmware"),
Self::RedirectNotAllowed => Some("LogStatusNotification"),
Self::InternalError => Some("(generic)"),
Self::OutOfMemory => Some("(generic)"),
Self::OutOfStorage => Some("(generic)"),
Self::InvalidIdToken => Some("RequestStartTransaction"),
Self::TxInProgress => {
Some("ChangeAvailability, Reset, RequestStartTransaction")
}
Self::TxNotFound => {
Some("RequestStopTransaction, SetChargingProfile, GetVehicleCertificate")
}
Self::TxStarted => Some("RequestStartTransaction"),
Self::InvalidValue => Some("(generic)"),
Self::MissingParam => Some("(generic)"),
Self::TooLargeElement => Some("CertificateSigned, InstallCertificate"),
Self::TooManyElements => {
Some("SetChargingProfile, SetVariables, SendLocalList")
}
Self::UnsupportedParam => Some("(generic)"),
Self::ValueOutOfRange => Some("SetVariables, SetVariableMonitoring"),
Self::ValuePositiveOnly => Some("(generic)"),
Self::ValueTooHigh => Some("(generic)"),
Self::ValueTooLow => Some("(generic)"),
Self::ValueZeroNotAllowed => Some("(generic)"),
}
}
}
impl core::fmt::Display for ReasonCode {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl core::str::FromStr for ReasonCode {
type Err = UnknownValue;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_wire(value).ok_or(UnknownValue)
}
}
/// Standardized `UnitOfMeasure.unit` values.
///
/// Named `Unit` rather than `UnitOfMeasure` to leave that name to the schema-generated struct of the same name in `common`.
///
/// A *closed* set: it holds only the values the specification
/// defines. The wire field is a string, so a deployment can still
/// send something else -- `from_wire` returns `None` for that,
/// which is not by itself a protocol error.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Unit {
/// Amperes (current)
A,
/// Arbitrary Strength Unit (Signal Strength)
ASU,
/// Bytes
B,
/// Degrees (temperature)
Celsius,
/// Decibel (for example Signal Strength)
#[cfg_attr(feature = "serde", serde(rename = "dB"))]
DB,
/// Power relative to 1mW (^10^log(P/1mW))
#[cfg_attr(feature = "serde", serde(rename = "dBm"))]
DBm,
/// Degrees (angle/rotation)
Deg,
/// Degrees (temperature)
Fahrenheit,
/// Hertz (frequency)
Hz,
/// milliHertz (frequency)
#[cfg_attr(feature = "serde", serde(rename = "mHz"))]
MHz,
/// Degrees Kelvin (temperature)
K,
/// Lux (Light Intensity)
#[cfg_attr(feature = "serde", serde(rename = "lx"))]
Lx,
/// Meter (length)
#[cfg_attr(feature = "serde", serde(rename = "m"))]
M,
/// m/s^2^ (Acceleration)
#[cfg_attr(feature = "serde", serde(rename = "ms2"))]
Ms2,
/// Newtons (Force)
N,
/// Ohm (Impedance)
Ohm,
/// kiloPascal (Pressure)
#[cfg_attr(feature = "serde", serde(rename = "kPa"))]
KPa,
/// Percentage
Percent,
/// Relative Humidity%
RH,
/// Revolutions per Minute
RPM,
/// Seconds (Time)
#[cfg_attr(feature = "serde", serde(rename = "s"))]
S,
/// Voltage (DC or r.m.s. AC)
V,
/// Volt-Ampere (apparent power)
VA,
/// kiloVolt-Ampere (apparent power)
#[cfg_attr(feature = "serde", serde(rename = "kVA"))]
KVA,
/// Volt-Ampere-hours (apparent energy)
VAh,
/// kiloVolt-Ampere-hours (apparent energy)
#[cfg_attr(feature = "serde", serde(rename = "kVAh"))]
KVAh,
/// vars (reactive power)
#[cfg_attr(feature = "serde", serde(rename = "var"))]
Var,
/// kilovars (reactive power)
#[cfg_attr(feature = "serde", serde(rename = "kvar"))]
Kvar,
/// var-hours (reactive energy)
#[cfg_attr(feature = "serde", serde(rename = "varh"))]
Varh,
/// kilovar-hours (reactive energy)
#[cfg_attr(feature = "serde", serde(rename = "kvarh"))]
Kvarh,
/// Watts (power)
W,
/// kilowatts (power)
#[cfg_attr(feature = "serde", serde(rename = "kW"))]
KW,
/// Watt-hours (energy). Default
Wh,
/// kilowatt-hours (energy)
#[cfg_attr(feature = "serde", serde(rename = "kWh"))]
KWh,
}
impl Unit {
/// Every value this version's specification defines (34), in spec order.
pub const ALL: &'static [Self] = &[
Self::A,
Self::ASU,
Self::B,
Self::Celsius,
Self::DB,
Self::DBm,
Self::Deg,
Self::Fahrenheit,
Self::Hz,
Self::MHz,
Self::K,
Self::Lx,
Self::M,
Self::Ms2,
Self::N,
Self::Ohm,
Self::KPa,
Self::Percent,
Self::RH,
Self::RPM,
Self::S,
Self::V,
Self::VA,
Self::KVA,
Self::VAh,
Self::KVAh,
Self::Var,
Self::Kvar,
Self::Varh,
Self::Kvarh,
Self::W,
Self::KW,
Self::Wh,
Self::KWh,
];
/// This value as it appears on the wire.
pub const fn as_str(&self) -> &'static str {
match self {
Self::A => "A",
Self::ASU => "ASU",
Self::B => "B",
Self::Celsius => "Celsius",
Self::DB => "dB",
Self::DBm => "dBm",
Self::Deg => "Deg",
Self::Fahrenheit => "Fahrenheit",
Self::Hz => "Hz",
Self::MHz => "mHz",
Self::K => "K",
Self::Lx => "lx",
Self::M => "m",
Self::Ms2 => "ms2",
Self::N => "N",
Self::Ohm => "Ohm",
Self::KPa => "kPa",
Self::Percent => "Percent",
Self::RH => "RH",
Self::RPM => "RPM",
Self::S => "s",
Self::V => "V",
Self::VA => "VA",
Self::KVA => "kVA",
Self::VAh => "VAh",
Self::KVAh => "kVAh",
Self::Var => "var",
Self::Kvar => "kvar",
Self::Varh => "varh",
Self::Kvarh => "kvarh",
Self::W => "W",
Self::KW => "kW",
Self::Wh => "Wh",
Self::KWh => "kWh",
}
}
/// Parses a wire value, returning `None` for values the
/// specification doesn't define (e.g. a vendor's own).
pub fn from_wire(value: &str) -> Option<Self> {
match value {
"A" => Some(Self::A),
"ASU" => Some(Self::ASU),
"B" => Some(Self::B),
"Celsius" => Some(Self::Celsius),
"dB" => Some(Self::DB),
"dBm" => Some(Self::DBm),
"Deg" => Some(Self::Deg),
"Fahrenheit" => Some(Self::Fahrenheit),
"Hz" => Some(Self::Hz),
"mHz" => Some(Self::MHz),
"K" => Some(Self::K),
"lx" => Some(Self::Lx),
"m" => Some(Self::M),
"ms2" => Some(Self::Ms2),
"N" => Some(Self::N),
"Ohm" => Some(Self::Ohm),
"kPa" => Some(Self::KPa),
"Percent" => Some(Self::Percent),
"RH" => Some(Self::RH),
"RPM" => Some(Self::RPM),
"s" => Some(Self::S),
"V" => Some(Self::V),
"VA" => Some(Self::VA),
"kVA" => Some(Self::KVA),
"VAh" => Some(Self::VAh),
"kVAh" => Some(Self::KVAh),
"var" => Some(Self::Var),
"kvar" => Some(Self::Kvar),
"varh" => Some(Self::Varh),
"kvarh" => Some(Self::Kvarh),
"W" => Some(Self::W),
"kW" => Some(Self::KW),
"Wh" => Some(Self::Wh),
"kWh" => Some(Self::KWh),
_ => None,
}
}
}
impl core::fmt::Display for Unit {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
impl core::str::FromStr for Unit {
type Err = UnknownValue;
fn from_str(value: &str) -> Result<Self, Self::Err> {
Self::from_wire(value).ok_or(UnknownValue)
}
}
/// One `(component, variable)` pair of the standardized device model.
///
/// The schemas describe the *shape* of `GetVariables`/`SetVariables`
/// but not which pairs are meaningful; the spec states those in its
/// device model appendix.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct DeviceModelEntry {
/// `None` when the variable applies to any component rather
/// than a named one (the spec's `<generic>` rows).
pub component: Option<&'static str>,
pub variable: &'static str,
/// The `VariableAttribute.type` values this row is about, where
/// the spec's table narrowed them -- e.g. `Min/MaxSet` for a row
/// describing only a variable's `MinSet` and `MaxSet`
/// attributes. `None` means the row is about the variable
/// generally.
pub attributes: Option<&'static str>,
/// The `Variable.instance` this row describes, where the spec
/// names one.
pub instance: Option<&'static str>,
/// Whether support is required: `yes`, `no`, or `V2X` (required
/// only for V2X-capable stations). Kept as the spec's own text
/// rather than a bool, since it is not a two-state field.
pub required: Option<&'static str>,
pub data_type: Option<&'static str>,
pub unit: Option<&'static str>,
}
/// Every `(component, variable)` pair the standardized device model defines (339).
pub const DEVICE_MODEL: &[DeviceModelEntry] = &[
DeviceModelEntry {
component: None,
variable: "ACCurrent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("A"),
},
DeviceModelEntry {
component: None,
variable: "Active",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "ACVoltage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("V"),
},
DeviceModelEntry {
component: None,
variable: "AllowReset",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Angle",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Deg"),
},
DeviceModelEntry {
component: None,
variable: "Attempts",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Certificate",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Color",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Complete",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "ConnectedTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("s"),
},
DeviceModelEntry {
component: None,
variable: "Count",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "CurrentImbalance",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: None,
variable: "DataText",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "DateTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("dateTime"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "DCCurrent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("A"),
},
DeviceModelEntry {
component: None,
variable: "DCVoltage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("V"),
},
DeviceModelEntry {
component: None,
variable: "ECVariant",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Energy",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh, kWh"),
},
DeviceModelEntry {
component: None,
variable: "Entries",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Fallback",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "FanSpeed",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("RPM"),
},
DeviceModelEntry {
component: None,
variable: "FirmwareVersion",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Force",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("N"),
},
DeviceModelEntry {
component: None,
variable: "Formats",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Frequency",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Hz"),
},
DeviceModelEntry {
component: None,
variable: "FuseRating",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("A"),
},
DeviceModelEntry {
component: None,
variable: "Height",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("m"),
},
DeviceModelEntry {
component: None,
variable: "Humidity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("RH"),
},
DeviceModelEntry {
component: None,
variable: "Hysteresis",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: None,
variable: "ICCID",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Impedance",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Ohm"),
},
DeviceModelEntry {
component: None,
variable: "IMSI",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Interval",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: None,
variable: "Length",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("m"),
},
DeviceModelEntry {
component: None,
variable: "Light",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("lx"),
},
DeviceModelEntry {
component: None,
variable: "Manufacturer",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Message",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "MinimumStatusDuration",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: None,
variable: "Mode",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Model",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "NetworkAddress",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Operated",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "OperatingTimes",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Overload",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Percent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: None,
variable: "PhaseRotation",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "PostChargingTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("s"),
},
DeviceModelEntry {
component: None,
variable: "Power",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("W, kW"),
},
DeviceModelEntry {
component: None,
variable: "Problem",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Protecting",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "SerialNumber",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "SignalStrength",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("dBm"),
},
DeviceModelEntry {
component: None,
variable: "State",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "StateOfCharge",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: None,
variable: "Storage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("B"),
},
DeviceModelEntry {
component: None,
variable: "SupplyPhases",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Suspending",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Suspension",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Temperature",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Celsius, Fahrenheit"),
},
DeviceModelEntry {
component: None,
variable: "Time",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("dateTime"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Timeout",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("s"),
},
DeviceModelEntry {
component: None,
variable: "Tries",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Tripped",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "VendorName",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "VersionDate",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("dateTime"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "VersionNumber",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "VoltageImbalance",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: None,
variable: "CommunicationParent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "ElectricalParent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "LogicalParent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "PhysicalParent",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: None,
variable: "Label",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "Interval",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "Measurands",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "SendDuringIdle",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "SignReadings",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "SignUpdatedReadings",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "TxEndedInterval",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("AlignedDataCtrlr"),
variable: "TxEndedMeasurands",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "LifeTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "Policy",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "Storage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("B"),
},
DeviceModelEntry {
component: Some("AuthCacheCtrlr"),
variable: "DisablePostAuthorize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "AdditionalInfoItemsPerMessage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "AuthorizeRemoteStart",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "LocalAuthorizeOffline",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "LocalPreAuthorize",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "MasterPassGroupId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "OfflineTxForUnknownIdEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "DisableRemoteAuthorization",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("AuthCtrlr"),
variable: "SupportedIdTokenType",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "SelftestActive",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "CHAdeMOProtocolNumber",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "VehicleStatus",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "DynamicControl",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "HighCurrentControl",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "HighVoltageControl",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CHAdeMOCtrlr"),
variable: "AutoManufacturerCode",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "AllowNewSessionsPendingFirmwareUpdate",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "AvailabilityState",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "Available",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "Model",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "SupplyPhases",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "VendorName",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ChargingStation"),
variable: "ActiveTransactionId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "DateTime",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("dateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "NextTimeOffsetTransitionDateTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("dateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "NtpServerUri",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "NtpSource",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "TimeAdjustmentReportingThreshold",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "TimeOffset",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "TimeSource",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("SequenceList"),
unit: None,
},
DeviceModelEntry {
component: Some("ClockCtrlr"),
variable: "TimeZone",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ProtocolAgreed",
attributes: None,
instance: None,
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ProtocolSupportedByEV",
attributes: None,
instance: Some("<Priority>"),
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "VehicleID",
attributes: None,
instance: None,
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "VehicleCertificate",
attributes: None,
instance: Some("Leaf"),
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "VehicleCertificate",
attributes: None,
instance: Some("SubCA1"),
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "VehicleCertificate",
attributes: None,
instance: Some("SubCA2"),
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "VehicleCertificate",
attributes: None,
instance: Some("Root"),
required: Some("V2X"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ACCurrent",
attributes: Some("Min/MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("A"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "DCCurrent",
attributes: Some("Min/MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("A"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "DCCurrent",
attributes: Some("Target"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("V"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "DCVoltage",
attributes: Some("Min/MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("V"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "DCVoltage",
attributes: Some("Target"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("V"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "Power",
attributes: Some("MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("W"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "EnergyImport",
attributes: Some("MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "EnergyImport",
attributes: Some("MinSet"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "EnergyImport",
attributes: Some("Target"),
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "BatteryCapacity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "DepartureTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "RemainingTimeBulk",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "RemainingTimeFull",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "StateOfChargeBulk",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("%"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "StateOfCharge",
attributes: Some("MaxSet"),
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("%"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "StateOfCharge",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("%"),
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ChargingCompleteBulk",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ChargingCompleteFull",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ConnectedEV"),
variable: "ChargingState",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "AvailabilityState",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "Available",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "ChargeProtocol",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "ConnectorType",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "SupplyPhases",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("Connector"),
variable: "SlotStatus",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("CPPWMController"),
variable: "State",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("CustomizationCtrlr"),
variable: "CustomImplementationEnabled",
attributes: None,
instance: Some("<vendorId>"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("CustomizationCtrlr"),
variable: "CustomTriggers",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: Some("GetReport"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: Some("GetVariables"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: Some("SetVariables"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ConfigurationValueSize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: Some("GetReport"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: Some("GetVariables"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: Some("SetVariables"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ReportingValueSize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DeviceDataCtrlr"),
variable: "ValueSize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DisplayMessageCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("DisplayMessageCtrlr"),
variable: "DisplayMessages",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("DisplayMessageCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("DisplayMessageCtrlr"),
variable: "Language",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "AllowReset",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "AvailabilityState",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "Available",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "EvseId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "Power",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("decimal"),
unit: Some("W, kW"),
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "SupplyPhases",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "DCInputPhaseControl",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "ISO15118EvseId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "ChargingState",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("EVSE"),
variable: "ActiveTransactionId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("FiscalMetering"),
variable: "EnergyExport",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh, kWh"),
},
DeviceModelEntry {
component: Some("FiscalMetering"),
variable: "EnergyExportRegister",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh, kWh"),
},
DeviceModelEntry {
component: Some("FiscalMetering"),
variable: "EnergyImport",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh, kWh"),
},
DeviceModelEntry {
component: Some("FiscalMetering"),
variable: "EnergyImportRegister",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh, kWh"),
},
DeviceModelEntry {
component: Some("FiscalMetering"),
variable: "PublicKey",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "CentralContractValidationAllowed",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "ContractValidationOffline",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "SeccId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "MaxScheduleEntries",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "RequestedEnergyTransferMode",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "RequestMeteringReceipt",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "CountryName",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "OrganizationName",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "PnCEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "V2GCertificateInstallationEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "ContractCertificateInstallationEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "CertificateStatusSource",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "NotificationDelay",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "ServiceRenegotiationSupport",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "MaxPriceElements",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("ISO15118Ctrlr"),
variable: "ProtocolSupported",
attributes: None,
instance: Some("1, 2 .. 20"),
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "Entries",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "Storage",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("B"),
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "DisablePostAuthorize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalAuthListCtrlr"),
variable: "SupportsExpiryDateTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("LocalEnergyStorage"),
variable: "Capacity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("Wh"),
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: Some("ClearVariableMonitoring"),
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "BytesPerMessage",
attributes: None,
instance: Some("SetVariableMonitoring"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: Some("ClearVariableMonitoring"),
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "ItemsPerMessage",
attributes: None,
instance: Some("SetVariableMonitoring"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "OfflineQueuingSeverity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "MonitoringBase",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "MonitoringLevel",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "ActiveMonitoringBase",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("MonitoringCtrlr"),
variable: "ActiveMonitoringLevel",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "ActiveNetworkProfile",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "FileTransferProtocols",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "HeartbeatInterval",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "MessageTimeout",
attributes: None,
instance: Some("Default"),
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "MessageAttemptInterval",
attributes: None,
instance: Some("TransactionEvent"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "MessageAttempts",
attributes: None,
instance: Some("TransactionEvent"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "NetworkConfigurationPriority",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "NetworkProfileConnectionAttempts",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "OfflineThreshold",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "PublicKeyWithSignedMeterValue",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "QueueAllMessages",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "ResetRetries",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "RetryBackOffRandomRange",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "RetryBackOffRepeatTimes",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "RetryBackOffWaitMinimum",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "UnlockOnEVSideDisconnect",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "WebSocketPingInterval",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "FieldLength",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("OCPPCommCtrlr"),
variable: "ExternalConfigChangeDate",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("ReservationCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ReservationCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("ReservationCtrlr"),
variable: "NonEvseSpecific",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "SignReadings",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "SignStartedReadings",
attributes: None,
instance: None,
required: None,
data_type: None,
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "SignUpdatedReadings",
attributes: None,
instance: None,
required: None,
data_type: None,
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "TxEndedInterval",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "TxEndedMeasurands",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "TxStartedMeasurands",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "TxUpdatedInterval",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "TxUpdatedMeasurands",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("SampledDataCtrlr"),
variable: "RegisterValuesWithoutPhases",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "AllowSecurityProfileDowngrade",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "AdditionalRootCertificateCheck",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "BasicAuthPassword",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("passwordString"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "CertificateEntries",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "CertSigningRepeatTimes",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "CertSigningWaitMinimum",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "Identity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("identifierString"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "MaxCertificateChainSize",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "OrganizationName",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("SecurityCtrlr"),
variable: "SecurityProfile",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ACPhaseSwitchingSupported",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "Available",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "Entries",
attributes: None,
instance: Some("ChargingProfiles"),
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ExternalControlSignalsEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "LimitChangeSignificance",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("decimal"),
unit: Some("Percent"),
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "NotifyChargingLimitWithSchedules",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "PeriodsPerSchedule",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "Phases3to1",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ProfileStackLevel",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "RateUnit",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ExternalConstraintsProfileDisallowed",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ChargingProfilePersistence",
attributes: None,
instance: Some("TxProfile"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ChargingProfilePersistence",
attributes: None,
instance: Some("LocalGeneration"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "ChargingProfilePersistence",
attributes: None,
instance: Some("ChargingStationExternalConstraints"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("SmartChargingCtrlr"),
variable: "MaxExternalConstraintsId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Available",
attributes: None,
instance: Some("Tariff"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Available",
attributes: None,
instance: Some("Cost"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Currency",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Enabled",
attributes: None,
instance: Some("Tariff"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Enabled",
attributes: None,
instance: Some("Cost"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Enabled",
attributes: None,
instance: Some("RunningCost"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "TariffFallbackMessage",
attributes: None,
instance: Some("<language>"),
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "TotalCostFallbackMessage",
attributes: None,
instance: Some("<language>"),
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "OfflineTariffFallbackMessage",
attributes: None,
instance: Some("<language>"),
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Interval",
attributes: None,
instance: Some("Tariff"),
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "Interval",
attributes: None,
instance: Some("Cost"),
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TariffCostCtrlr"),
variable: "ConditionsSupported",
attributes: None,
instance: Some("Tariff"),
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TokenReader"),
variable: "Token",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("TokenReader"),
variable: "TokenType",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "ChargingTime",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "EVConnectionTimeOut",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "MaxEnergyOnInvalidId",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "StopTxOnEVSideDisconnect",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "StopTxOnInvalidId",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "TxBeforeAcceptedEnabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "TxStartPoint",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "TxStopPoint",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "ResumptionTimeout",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "EnergyTransferResumptionRandomRange",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("integer"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("TxCtrlr"),
variable: "AllowEnergyTransferResumption",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("FrequencySimulator"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("FrequencySimulator"),
variable: "DateTime",
attributes: None,
instance: Some("Start"),
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("FrequencySimulator"),
variable: "DateTime",
attributes: None,
instance: Some("End"),
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("FrequencySimulator"),
variable: "FrequencySchedule",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("DataCollector"),
variable: "Enabled",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("DataCollector"),
variable: "DateTime",
attributes: None,
instance: Some("Start"),
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("DataCollector"),
variable: "DateTime",
attributes: None,
instance: Some("End"),
required: Some("no"),
data_type: Some("DateTime"),
unit: None,
},
DeviceModelEntry {
component: Some("DataCollector"),
variable: "SamplingInterval",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("decimal"),
unit: Some("s"),
},
DeviceModelEntry {
component: Some("DataCollector"),
variable: "SampledMeasurands",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("MemberList"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "OcppCsmsUrl",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "OcppInterface",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "OcppTransport",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "OcppVersion",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("OptionList"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "MessageTimeout",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "SecurityProfile",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("integer"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "Identity",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "BasicAuthPassword",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "CsmsRootCertificateHashAlgorithm",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "CsmsRootCertificateIssuerKeyHash",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "CsmsRootCertificateIssuerNameHash",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "CsmsRootCertificateSerialNumber",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnEnabled",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnType",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnServer",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnUser",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnGroup",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnPassword",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "VpnKey",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "ApnEnabled",
attributes: None,
instance: None,
required: Some("yes"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "Apn",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "ApnUserName",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "ApnPassword",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "SimPin",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "PreferredNetwork",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "UseOnlyPreferredNetwork",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("boolean"),
unit: None,
},
DeviceModelEntry {
component: Some("NetworkConfiguration"),
variable: "ApnAuthentication",
attributes: None,
instance: None,
required: Some("no"),
data_type: Some("string"),
unit: None,
},
];