Beides war nie mehr als eine Ankuendigung: die config.toml nahm [auth.ldap] und
[auth.oidc] entgegen, gelesen wurden die Abschnitte von keiner Zeile Code. Ein
Feld, das nichts tut, ist schlimmer als ein fehlendes, weil es Arbeit vortaeuscht
und beim Lesen des Codes jedes Mal die Frage aufwirft, wo es denn verwendet wird.
Raus sind AuthConfig, LdapConfig und OidcConfig samt dem auth-Feld in Config,
die auskommentierten Beispielabschnitte, der tote Verweis auf
auth::local::ldap_stub und die Erwaehnungen in allen acht Doku-Dateien.
Bestehende Konfigurationsdateien laufen weiter: serde ueberliest unbekannte
Abschnitte, ein zurueckgebliebenes [auth.ldap] fuehrt also nicht zum Abbruch.
In der Datenbank bleiben users.auth_source mit seiner Werteliste und
users.external_id stehen. Die Werteliste zu aendern hiesse in SQLite, die
Tabelle neu aufzubauen, und das lohnt fuer zwei ungenutzte Werte nicht.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zwei neue Funktionen (Passwortwechsel und Monatsberichte per Mail) und die
Behebung der falschen 0 kWh bei laufenden Ladungen. Damit eine Minor-Version
statt eines Patch.
Cargo.toml und Cargo.lock zusammen gehoben, dazu die vier
Installationsanleitungen und ein Abschnitt in CHANGELOG.md nach den Regeln aus
CLAUDE.md: englisch, aus Sicht der Anwender, Update-Hinweise am Ende.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Bestehende Installationen brachen beim Start mit dem Windows-Release-Binary
ab: "migration 1 was previously applied but has been modified" – obwohl die
Migration inhaltlich seit v0.2.0 unverändert ist.
Ursache: .gitattributes enthielt nur "* text=auto". Zusammen mit
core.autocrlf=true (Standard auf windows-latest-Runnern) checkt
actions/checkout die .sql-Dateien als CRLF aus. sqlx::migrate! bettet den
Dateiinhalt zur Compile-Zeit ein und bildet darüber eine SHA-384-Summe, die
beim Start gegen _sqlx_migrations geprüft wird:
0001_initial.sql mit LF -> 0651a39f...
0001_initial.sql mit CRLF -> 90093a9a...
Die GitHub-Windows-Builds v0.2.0 und v0.3.0 tragen die CRLF-Variante, lokal
gebaute Exes und der Linux-Build die LF-Variante. Datenbanken, die mit einem
LF-Binary angelegt wurden, kollidieren daher mit dem Windows-Release-ZIP.
Zwei Änderungen:
1. .gitattributes erzwingt "*.sql text eol=lf". Ab jetzt erzeugen Windows-
und Linux-Runner identische Prüfsummen.
2. db::repair_line_ending_checksums() hebt eine gespeicherte Prüfsumme vor
dem Migrationslauf an – aber nur, wenn sie exakt der Zeilenenden-Variante
desselben SQL entspricht, in beide Richtungen. Ohne diesen Schritt würde
Punkt 1 jede Installation brechen, die mit dem CRLF-Binary aus dem
GitHub-ZIP von v0.2.0/v0.3.0 angelegt wurde. Echte inhaltliche
Abweichungen führen weiterhin zum Abbruch durch sqlx.
sha2 wird dafür direkte Dependency (war bereits transitiv gelockt, die
Auflösung ändert sich nicht).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Web-UI komplett viersprachig: zentrale Übersetzungstabelle (src/i18n.rs,
~200 Keys), Spracherkennung via lang-Cookie und Accept-Language mit
Umschalter in der Topbar (Fallback Englisch). Übersetzt sind alle
Templates, Fehlermeldungen, CSV-Export und der PDF-Monatsbericht
(inkl. Monatsnamen und sprachspezifischem Datumsformat).
Doku viersprachig: README.md jetzt Englisch mit README.de/fr/es.md,
Installations-Guide als ANLEITUNG.md (DE) + INSTALL(.fr/.es).md;
alle Sprachversionen landen im Release-Paket.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>