Zählerstände erfassen, auswerten und prognostizieren (Strom, Gas, Wasser, Fahrzeuge)
  • Rust 87.4%
  • HTML 6.5%
  • Fluent 3.8%
  • JavaScript 1.4%
  • Shell 0.4%
  • Other 0.4%
Find a file
Tom Irgang 10f0eb731a
Some checks failed
ci / rust (push) Has been cancelled
ci / perf (push) Has been cancelled
ci / docs (push) Has been cancelled
ci / mermaid (push) Has been cancelled
ci / helm (push) Has been cancelled
ci / smoke (push) Has been cancelled
ci / a11y (push) Has been cancelled
ci / image (push) Has been cancelled
performance v1.4
2026-10-25 16:40:24 +01:00
.forgejo/workflows plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
.github/workflows Docs als Github Pages 2026-10-19 16:50:41 +02:00
config plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
crates plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
deploy plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
docs performance v1.4 2026-10-25 16:40:24 +01:00
plugins plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
scripts plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
tests/browser plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
.dockerignore Requriements und Architektur 2026-10-15 17:04:15 +02:00
.env.example Mehrere Personen, Historie, Ampel, Benachrichtigungen 2026-10-16 20:57:32 +02:00
.gitignore Fix: Fahrzeug 2026-10-19 13:35:40 +02:00
Cargo.lock plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
Cargo.toml plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
clippy.toml Requriements und Architektur 2026-10-15 17:04:15 +02:00
compose.keycloak.yaml MVP abschließen 2026-10-16 13:31:00 +02:00
compose.mail.yaml API, Export, Betrieb, Abschluss 2026-10-17 19:56:30 +02:00
compose.otel.yaml MVP abschließen 2026-10-16 13:31:00 +02:00
compose.postgres.yaml Requriements und Architektur 2026-10-15 17:04:15 +02:00
compose.replicas.yaml API, Export, Betrieb, Abschluss 2026-10-17 19:56:30 +02:00
compose.s3.yaml MVP abschließen 2026-10-16 13:31:00 +02:00
compose.yaml Mehrere Personen, Historie, Ampel, Benachrichtigungen 2026-10-16 20:57:32 +02:00
Dockerfile plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
LICENSE-APACHE Requriements und Architektur 2026-10-15 17:04:15 +02:00
LICENSE-MIT Requriements und Architektur 2026-10-15 17:04:15 +02:00
README.md plugins, Senec plugin und release v1.4 2026-10-25 16:29:42 +01:00
rust-toolchain.toml Requriements und Architektur 2026-10-15 17:04:15 +02:00

Zähler

Cloud-/Kubernetes-native Web-App in Rust zum Erfassen und Auswerten von Zählerständen: Strom, Gas, Wasser, Wärme, Fahrzeug-Kilometer und weitere Verbrauchsgrößen.

  • Erfassung per Formular oder Foto mit AI-Erkennung (OpenRouter)
  • Vergleiche mit Vormonat, Vorjahr und 3/6/12-Monats-Durchschnitt, Ampel für den Erwartungsbereich
  • Prognose von Jahresverbrauch und Kosten, Abgleich mit dem Abschlag
  • Tarife mit Grund-/Arbeitspreis, Staffeln, Boni, mehreren Kostenpositionen
  • Fahrzeuge: Kostenbuch, Wertverlust, Kosten pro km je Jahr und über die Haltedauer
  • Erinnerungen und Alarme per E-Mail
  • PostgreSQL (CloudNativePG) oder SQLite, Helm-Chart und docker compose

Version 1.3.0: siehe Umsetzungsplan v1.1 und das Benutzerhandbuch. Neu in 1.3: Brotkrumenleiste mit dem tatsächlichen Weg zurück zur Herkunftsseite, Formulare blenden nicht benötigte Felder aus, Kostenbuch mit Kategorien je Antriebsart, Ansicht aller Einträge und Jahresnavigation nur über Jahre mit Einträgen, Kosten pro km über die Haltedauer und als Prognose über die Lebensdauer, Ablesungen mit Filter (Register, Quelle, Zeitraum) und Seiten, CSV-Import in den Einstellungen, Löschen von Messstellen als eigener Abschnitt.

Neu in 1.2: Messstellen löschen, Setup-Assistent mit bedingten Feldern und vorhandenen Zählern, Lesen und Schreiben aller Daten über die REST-API, Wertverlust nach Restwertkurve (Alter, Laufleistung), Strompreis fürs Heimladen, Fahrzeugkosten in der Kostenübersicht und Import von SENEC-Wochenexporten.

Neu in 1.4: Plugins als eigenständige Programme, aktivierbar je Haushalt unter Einstellungen, mit eigenen Seiten im Menü und automatischem Zugang zur REST-API; erstes Plugin ist der SENEC-Import mit Upload mehrerer Wochenexporte, Vorschau und Import (ersetzt scripts/senec_import.py).

Schnellstart

# lokal (SQLite unter ./data, Entwicklungs-Login unter /auth/login)
ZAEHLER_AUTH__DEV_LOGIN=true ZAEHLER_LOG__FORMAT=pretty cargo run -p zaehler-server
# → http://localhost:8080, Metriken unter http://localhost:9090/metrics

# docker compose
cp .env.example .env
docker compose up -d --build

Kubernetes: siehe docs/betrieb/kubernetes.md.

Dokumentation

Anforderungen, Architektur, ADRs und Betrieb liegen in docs/ und werden mit Sphinx + sphinx-needs gerendert (inkl. Requirements-Tracing bis in den Code):

uv run --project docs sphinx-autobuild docs docs/_build/html

Auf dem GitHub-Spiegel veröffentlicht der Workflow .github/workflows/docs.yaml die Dokumentation bei jedem Push auf main über GitHub Pages (einmalig unter Settings → Pages → Source „GitHub Actions“ auswählen).

Entwicklung

cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all

Konventionen zum Tracing (// @impl SPEC_…, // @test SPEC_…) stehen in docs/entwicklung/index.md.

Container-Release auf Forgejo

Docker mit Buildx wird benötigt. Zuerst bei der Registry anmelden:

docker login code.do9ita.de
scripts/release.sh

Das Skript baut mit dem vorhandenen Dockerfile und überträgt code.do9ita.de/tom/zaehler:1.3.0 und code.do9ita.de/tom/zaehler:latest. Die Version wird aus Cargo.toml gelesen und mit version und appVersion des Helm-Charts verglichen. Nicht committete Änderungen verhindern einen Release; --allow-dirty erlaubt bewusst einen lokalen Entwicklungsstand. --dry-run baut ohne Push und ohne Anmeldung.

Für CI können FORGEJO_USER und FORGEJO_TOKEN (Paket-Schreibrecht) gemeinsam gesetzt werden. Das Token gelangt ausschließlich über Standardeingabe an docker login, nicht als Kommandozeilenargument. Alternativ wird die bestehende Docker-Anmeldung verwendet. REGISTRY, IMAGE (mit Registry-Präfix) und PLATFORMS sind überschreibbar, beispielsweise:

PLATFORMS=linux/amd64,linux/arm64 scripts/release.sh
bash scripts/test-release.sh

Für mehrere Plattformen wird bei Bedarf der Buildx-Builder zaehler-release mit dem Treiber docker-container angelegt. Image-Build und Push erfolgen gemeinsam mit beiden Tags; das Skript legt weder Git-Tags noch Commits an.

Lizenz

Dual lizenziert unter MIT oder Apache-2.0, nach Wahl.