Zwei Themen, die sich fast ueberall beruehren, plus die Umbenennung und die neue Projektseite. Mitarbeiter sind Benutzer Migration 0002 hatte `users` (Login) und `employees` (Person) getrennt. Die Verknuepfung wurde nur fuer Altdaten einmalig gesetzt und danach nie gepflegt, weshalb ein Nicht-Admin-Login praktisch nie eigene Ladungen sah. Migration 0003 loest `employees` auf: ein Mitarbeiter ist ein `users`-Eintrag mit `role='user'`, Chips und Transaktionen haengen wieder an `user_id`. Mitarbeiter ohne Login bekommen ein Konto ohne Passwort. Ein Mitarbeiter sieht und steuert ausschliesslich die Ladungen seiner eigenen Chips. Cockpit, Wallboxen, Chips und Benutzerverwaltung sind serverseitig admin-only, `/` leitet Nicht-Admins auf `/me`. Der letzte aktive Admin laesst sich nicht mehr degradieren, deaktivieren oder loeschen. Ladelimits Timer und Ziel-kWh je Ladung, Abschaltung beim zuerst erreichten Wert. Ein Watchdog prueft alle 15 s und schickt RemoteStopTransaction; das Energielimit wird zusaetzlich sofort nach eingehenden MeterValues geprueft. Lehnt die Wallbox ab, wird beim naechsten Takt erneut versucht. Vorgaben je Person setzt der Mitarbeiter selbst oder der Admin. Chip-Kategorie abgeleitet Chip mit Benutzer ist ein Mitarbeiter-Chip, ohne ein Gast-Chip. Vorher liessen sich Zuordnung und Kategorie widersprechen. Die Migration loest dabei die Pseudo-Person "Gast" auf, mit der der fehlende Begriff nachgebaut wurde. Umbenennung easy-occp auf easy-ocpp Im Produktnamen steckte ein Dreher, das Protokoll heisst OCPP. Betrifft Binary, Cookie, Doku und Release-Workflow. Bestehende Installationen verlieren nichts: existiert nur die alte data/easy-occp.db, wird sie weiterverwendet. Dazu Projektseite in vier Sprachen unter docs/ mit hreflang, Canonical, Open Graph, JSON-LD und Sitemap. READMEs auf die im Feld gebraeuchlichen Begriffe ausgerichtet (CSMS, OCPP-Server, self-hosted). Version 0.4.0. Gedankenstriche aus Code, Doku und UI-Texten entfernt; migrations/0001 und 0002 blieben dabei unangetastet, weil sqlx eine Pruefsumme ueber den Dateiinhalt bildet.
8.0 KiB
easy-ocpp
🌐 English · Deutsch · Français · Español
Serveur OCPP auto-hébergé (CSMS) pour bornes de recharge, conçu pour les PME disposant de 1 à 10 bornes. Gestion des points de charge, badges RFID, limites de recharge et rapports, sans abonnement cloud.
- Un seul binaire, un seul fichier SQLite – pas de base de données externe, pas de message broker.
- OCPP 1.6J (complet) + OCPP 2.0.1 (ossature WebSocket, BootNotification / TransactionEvent) + OCPP 1.5 SOAP (ossature pour Boot/Heartbeat).
- Interface web moderne (Askama + htmx), utilisateurs locaux avec mots de passe Argon2.
- Active Directory (LDAP) et Microsoft Entra (OIDC) sont préparés sous forme de champs de configuration – les implémentations concrètes des bind/flows suivront.
- Fonctionne sous Windows (priorité) et Linux.
Fonctionnalités
| Domaine | Statut |
|---|---|
| Inventaire des wallbox + statut (en ligne/hors ligne, connecteurs, firmware) | ✅ |
| Gestion des badges RFID, apprentissage via « fenêtre d'apprentissage » (2 min, interception Authorize) | ✅ |
| Attribution badge → utilisateur ; un badge sans utilisateur est un badge invité | ✅ |
| Déverrouillage à distance pour les invités, imputation sur un label invité | ✅ |
| Valeurs en direct pendant la charge (kWh chargés, puissance actuelle, SoC) | ✅ |
| Liste des transactions, filtre par utilisateur | ✅ |
| Statistiques par mois / trimestre / année | ✅ |
| Les utilisateurs sont les employés : badges, recharges et limites tiennent au compte | ✅ |
| Limites par recharge : objectif en kWh et/ou minuteur, arrêt automatique | ✅ |
| Valeurs par défaut par personne, définies par l'employé ou par l'admin | ✅ |
| Libre-service employé : sa recharge en direct, ses limites, arrêt par lui-même | ✅ |
| Interface multilingue (Deutsch, English, Français, Español) | ✅ |
| Active Directory (LDAP) | 🟡 Config préparée |
| Entra ID (OIDC) | 🟡 Config préparée |
Démarrage
Des binaires prêts à l'emploi (Windows x64, Linux x64) sont disponibles sous
Releases. Décompresser,
lancer easy-ocpp.exe ou easy-ocpp, c'est tout (voir INSTALL.fr.md dans le paquet).
Ou compiler soi-même :
# une seule fois : créer la config (optionnel)
copy config.example.toml config.toml
# Build + démarrage
cargo run --release
Ouvrir ensuite l'interface sur http://localhost:8080. Identifiants par défaut au premier démarrage : admin / admin – merci de changer le mot de passe immédiatement sous « Utilisateurs ».
Mot de passe admin oublié ?
cargo run --release -- --reset-admin "nouveauMotDePasse123"
Configurer une wallbox
Les wallbox établissent une connexion WebSocket :
ws://<host>:8080/ocpp/<ChargePointId>
Les sous-protocoles sont négociés automatiquement (ocpp1.6 ou ocpp2.0.1).
Pour les appareils OCPP 1.5 plus anciens (SOAP) :
POST http://<host>:8080/ocpp15
Mesures en direct pendant la charge
Lors de la connexion d'une wallbox OCPP 1.6, le serveur la configure
automatiquement pour qu'elle transmette toutes les 30 secondes, pendant une
charge, le relevé du compteur, la puissance et (si disponible) le SoC
(MeterValueSampleInterval, MeterValuesSampledData).
L'intervalle est réglable via config.toml, 0 désactive
l'auto-configuration :
[ocpp]
meter_interval_s = 30
Le cockpit et la page de détail de la wallbox actualisent automatiquement les charges en cours toutes les 10 secondes (polling htmx). Si une wallbox ne transmet pas la puissance, celle-ci est dérivée des deux derniers relevés de compteur.
Rôles et droits
Il n'existe qu'une seule sorte de personne : l'utilisateur. Un employé est un
utilisateur avec role = user ; ses badges, ses recharges et ses limites sont
rattachés directement à ce compte. Il n'y a plus de fiche employé distincte.
| Admin | Employé | |
|---|---|---|
| Tableau de bord, bornes, badges, gestion des utilisateurs | ✅ | – |
| Recharges de toutes les personnes | ✅ | – |
| Ses propres recharges (liste, CSV, statistiques, PDF mensuel) | ✅ | ✅ |
| Voir sa recharge en cours et l'arrêter | ✅ | ✅ |
| Objectif kWh / minuteur sur sa recharge en cours | ✅ | ✅ |
| Valeurs par défaut, les siennes | ✅ | ✅ |
| Valeurs par défaut de n'importe quel employé | ✅ | – |
Après connexion, un employé arrive sur /me et non sur le tableau de bord ;
la navigation ne lui montre que ce qu'il peut réellement ouvrir. Les restrictions
sont appliquées côté serveur, pas seulement masquées dans l'interface.
Les employés créés avant ce modèle de comptes sont repris sans mot de passe : leurs recharges sont enregistrées, mais ils ne peuvent pas se connecter tant qu'un administrateur ne leur en attribue pas un sous « Utilisateurs ».
Limites de recharge
Une recharge s'arrête automatiquement dès qu'elle atteint une énergie cible ou un minuteur, le premier des deux. Les deux sont facultatifs et peuvent être désactivés séparément.
- Valeurs par défaut par personne : l'employé les définit sur sa propre page, l'administrateur sur la fiche utilisateur. Elles sont reprises au démarrage de chaque recharge, le minuteur comptant alors depuis le début de la charge.
- Sur la recharge en cours : les valeurs restent modifiables pendant la charge. Le minuteur y signifie « arrêter dans N minutes », ce que l'on veut dire quand on se tient devant la borne.
Un chien de garde vérifie toutes les 15 secondes et envoie
RemoteStopTransaction. La limite d'énergie est en outre vérifiée dès l'arrivée
de nouvelles mesures, afin de ne pas continuer à charger jusqu'au cycle suivant.
Si la borne refuse l'arrêt, une nouvelle tentative a lieu au cycle suivant. La
recharge n'est considérée comme traitée qu'une fois la borne d'accord.
Stockage des données
Tout est stocké dans un seul fichier SQLite sous data/easy-ocpp.db (modifiable via config.toml). Les migrations se trouvent dans migrations/ et sont appliquées automatiquement au démarrage.
Contrôles de cohérence à la réception des données
- Timestamps : >24 h dans le futur ou >10 ans dans le passé sont rejetés – repli sur l'horloge du serveur.
- StartTransaction / StopTransaction : idempotents face aux répétitions ; les valeurs de compteur décroissantes sont corrigées.
- StatusNotification : UPSERT par (wallbox, connecteur) – pas de doublons.
- MeterValues : les valeurs négatives sont rejetées, le SoC est validé entre 0 et 100 %, kWh → Wh normalisés.
- Enrollment : un tag nouvellement capturé est associé à exactement une session de fenêtre d'apprentissage ouverte.
Structure du projet
src/
main.rs – point d'entrée, runtime Tokio, pool SQLite
config.rs – configuration TOML
db.rs – bootstrap + helpers (Argon2, paramètres)
error.rs – AppError / IntoResponse
auth/ – cookies de session + login local
domain/ – modèles de données (FromRow)
ocpp/
wire.rs – parseur de trames JSON OCPP
hub.rs – registre de toutes les connexions actives
ocpp16.rs – OCPP 1.6J (complet)
ocpp20.rs – OCPP 2.0.1 (bootstrap)
soap15.rs – endpoint OCPP 1.5 SOAP
limits.rs – chien de garde objectif kWh / minuteur
web/ – routeur axum, vues Askama
templates/ – templates HTML (Askama)
static/ – CSS + shim htmx (embarqué via rust-embed)
migrations/ – migrations SQLite
Licence
MIT