Files
easy-ocpp/README.fr.md
T
hilman2andGitHub d4f118c2cb Mitarbeiter sind Benutzer, Ladelimits, Umbenennung auf easy-ocpp (v0.4.0)
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.
2026-09-01 12:36:57 +02:00

8.0 KiB
Raw Permalink Blame History

easy-ocpp

🌐 English · Deutsch · Français · Español

CI Release License: MIT

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