# codetics-evse-id
E-mobility identifiers in the IDRR / eMI³ / ISO 15118 format, without the `COUNTRY*OPERATOR*` prefix:
a type character (`E` EVSE, `P` pool, `S` station) followed by up to 30 alphanumeric characters.
Generated identifiers end with a check character computed with the IDRR Annex 1 algorithm
(Chen, Niemenmaa & Vinck, 2013). It detects every single-character error and every adjacent
transposition. Annex 1 defines this check digit for contract IDs (EMAID); it is applied here to the
local part of the identifier.
```rust
use codetics_evse_id::{EvseId, IdType, check_digit};
// Annex 1 worked example.
assert_eq!(check_digit("DE83DUIEN83QGZ").unwrap(), 'D');
let station = EvseId::station(1);
assert_eq!(station.as_str(), "S000001D");
let evse = EvseId::evse_of(&station, 2).unwrap();
assert_eq!(evse.kind(), IdType::Evse);
assert!(EvseId::parse(evse.as_str()).is_ok());
assert!(evse.with_operator("FR", "ABC").starts_with("FR*ABC*E"));
```
## Part of Codetics OCPP
This crate belongs to [Codetics OCPP](https://codetics.fr), a complete OCPP 1.6J / 2.0.1 / 2.1
implementation in Rust written by **Kevin Vavelin** ([Codetics](https://codetics.fr)).
It can be used as is; contributions are welcome.
## License and credit
Licensed under the [Apache License, Version 2.0](LICENSE).
Copyright 2026 Kevin Vavelin, Codetics. Any redistribution of this crate or of a work derived
from it (including forks and products embedding it) must keep the copyright notice and include
the [NOTICE](NOTICE) file crediting Kevin Vavelin / Codetics as the origin of the work.