No description
  • HTML 53.9%
  • JavaScript 26.8%
  • C++ 15.3%
  • CSS 2%
  • Shell 1.2%
  • Other 0.8%
Find a file
Markus Oswald 16992a4ab3
All checks were successful
firmware / build (push) Successful in 28m54s
Mail-Absender aus den PocketBase-Einstellungen statt fest im Hook
Bisher stand markus@strogg.de in vier Hooks. Jetzt gilt überall, was unter
Einstellungen → Mail als Absender eingetragen ist — so zieht der Wechsel auf
eine @reeftank.pro-Adresse mit dem SMTP-Wechsel zusammen um.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 20:08:11 +02:00
.forgejo/workflows KH-Titration: Host-Test an simulierter Küvette; Verriegelung im NVS, Sondenwächter, Freigabe im Web 2026-09-17 23:34:23 +02:00
assets Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
cr-rechner Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
entwuerfe ICP-Werte: neue Kachel holt die Laborwerte von OSCI und reicht sie weiter 2026-09-22 23:44:33 +02:00
esp-firmware Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
geraete Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
icp Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
kalk Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
khtester Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
nutrient Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
pb_hooks Mail-Absender aus den PocketBase-Einstellungen statt fest im Hook 2026-09-23 20:08:11 +02:00
pb_migrations Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
salz Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
server Backup: rotieren vor dem Schreiben, umbenennen nach der Leseprobe 2026-09-08 22:25:33 +02:00
spurenrechner Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
tools Mail-Absender aus den PocketBase-Einstellungen statt fest im Hook 2026-09-23 20:08:11 +02:00
.gitignore gitignore: ESP-Release-Build-Ordner (.build_rel) ausschliessen 2026-07-04 23:05:43 +02:00
datenschutz.html Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
deploy.list ICP-Werte: neue Kachel holt die Laborwerte von OSCI und reicht sie weiter 2026-09-22 23:44:33 +02:00
FIRMWARE.md Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
impressum.html Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
index.html Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
KH-TESTER-INTEGRATION.md Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00
LICENSE Lizenz hinzugefügt: CC BY-NC-SA 4.0 2026-05-06 00:56:48 +02:00
README.md Domain-Umzug: fishtankpro.de → reeftank.pro, Firmware 0.16.1 2026-09-23 19:45:44 +02:00

Aquarium Rechner

Werkzeuge für Meerwasser-Aquaristik — von Wasserwechsel-Berechnung bis hin zu vollautomatischer Kalk-Dosierung mit eigener ESP32-Firmware.

Hosting

Selbst gehostet — die Web-Oberfläche wird direkt von einem eigenen PocketBase-Server ausgeliefert (statische Dateien im pb_public/, dazu API + Auth). Es gibt keine zentrale öffentliche Instanz; Details unter Hosting & Daten.

Die einzelnen Rechner liegen unter den Pfaden / (Übersicht), /cr-rechner/, /spurenrechner/, /salz/, /kalk/, /nutrient/ und /khtester/.

Inhalt

C&R Aquarium Rechner

Berechnet optimale Wasserwechsel mit C&R Lösungen, um ICP-Messwerte schrittweise zu Optimalwerten zu führen. Mit Max-Δ-Begrenzung pro Schritt für schonende Anpassung empfindlicher Korallen. Historie der Messwerte und ausgeführten Ausgleiche mit Verlaufsgrafik.

Spurenelemente Rechner

Plant Tagesdosen einzelner Spurenelemente basierend auf ICP-Messwerten und Verbrauchshistorie. Jede Dosis wird mit Beckenvolumen und Reichweite der Mischung gespeichert — ein Wechsel des ICP-Rhythmus (monatlich/14-tägig) rechnet die Historie deshalb um, statt die alten Millilitermengen weiterzuschreiben. Geregelt wird je Element unterschiedlich: aus den eigenen Messung-Dosis-Paaren schätzt der Rechner, wie viel an einer Abweichung Laborstreuung und wie viel echte Bewegung des Beckens ist, und wendet nur den entsprechenden Teil einer Korrektur an (Spalte γ). Die Schätzung verfeinert sich mit jeder ICP; der Zielwert bleibt derselbe, nur das Tempo passt sich an. Die Schrittweite folgt der engeren Seite des Zielbands, und wenn ein Element mehrere Runden gegen die Dosierung anläuft, benennt der Rechner die Ursache, statt weiter zu regeln. Daten lokal oder im eigenen Account.

Salz & Salinität

Rechnet Dichte, spezifisches Gewicht, Salinität und Leitfähigkeit ineinander um (EOS-80/PSS-78), passt die Salinität gezielt an und kalibriert Salz sowie Spindel. Verfolgt zusätzlich den Salz-Drift beim Balling.

Nährstoffmanagement (Web + ESP32-Firmware)

Regelt NO₃ und PO₄ über vier Pumpen (Stickstoff, Phosphat, Kohlenstoff, Lanthan). Lernt den Netto-Verbrauch aus der Massenbilanz und leitet daraus eine Erhaltungsdosis samt gerampter Korrektur ab. Die Wahl des Abbaumittels folgt dem molaren N:P-Verhältnis — Kohlenstoff senkt beide Werte, Lanthan wirkt gezielt auf Phosphat.

KH-Tester (Web + ESP32-Firmware)

Misst die Karbonathärte automatisch per Säure-Titration — wahlweise dynamisch bis zum Ziel-pH oder als Gran-Titration mit Regression über den Äquivalenzpunkt. Live-Verfolgung der laufenden Messung im Browser, pH-Kalibrierung mit Sonden-Gesundheitscheck, Überwachung von Säurevorrat und Abwasserbehälter. Ein Klick übernimmt das Ergebnis ins Kalkmanagement, das daraufhin seinen Dosierplan neu rechnet.

Kalkmanagement (Web + ESP32-Firmware)

Komplette Steuerung für eine selbstgebaute 4-Pumpen-Dosier-Anlage (Calcium, Magnesium, KH-Tag, KH-Nacht). Web-Interface plant die Dosierung, ESP32 führt sie aus.

Web-Funktionen:

  • Quick-Inputs für KH/Ca direkt auf der Übersicht + Live-Kanister-Balken
  • Dosier-Plan-Berechnung (KH + Ca/Mg) mit wählbarer Frequenz (212 pro Tag) — ohne Messwert als reine Erhaltungsdosierung aus der eingetragenen Verbrauchsrate
  • Plan-Visualisierung als Tabelle + Charts
  • Pumpen-Kalibrierung (Live-Lauf über das Web)
  • pH-Sensor-Kalibrierung (2-Punkt mit pH-4 + pH-7)
  • Container-Füllstand-Tracking
  • Historie (Messungen, Dosierungen) mit Charts
  • JSON-Backup/-Restore
  • OTA-Firmware-Update mit einem Klick

ESP32-Firmware:

  • Plan-Cache lokal (NVS) → läuft offline beliebig lange weiter (Anpassungs-Doses anhand absoluter Timestamps, danach unbegrenzte Erhaltungs-Dose)
  • DS3231-RTC-Sync → Dosier-Plan läuft auch nach Stromausfall ohne Internet weiter
  • Auto-Dosierung (per Schalter im Web aktivierbar)
  • Anti-Drip-Sequenz (Prime → Dose → Retract) für sauberes Stop-Verhalten
  • KH-Tag/Nacht-Umschaltung anhand pH-Wert oder Uhrzeit
  • pH-Wächter (optional): eine Sonde, deren Wert 6 h lang steht, gilt als eingefroren → Tag-Pumpe statt Nacht-Lösung, Störung im Gerät-Tab; dazu serverseitig eine E-Mail, wenn der pH ein einstellbares Fenster verlässt oder der ESP die eingefrorene Sonde meldet
  • WS2812-Status-LED zeigt System-Zustand
  • Ausfall-Benachrichtigung per E-Mail — ein serverseitiger Watchdog (PocketBase-Cron) überwacht den Heartbeat und meldet, wenn der ESP länger als 5 Min ausfällt (pro Nutzer im Gerät-Tab an/aus)
  • OTA-Update aus den Releases des eigenen Git-Servers (git.reeftank.pro) — CI baut das .bin automatisch bei jedem Version-Tag

Hosting & Daten

Statische HTML-Seiten, ausgeliefert direkt von PocketBase (pb_public/). Alles läuft im Browser.

Ohne Login (C&R, Spuren): Daten werden ausschließlich lokal im Browser gespeichert (localStorage). Nichts wird übertragen.

Mit Login (E-Mail/Passwort): Daten werden zusätzlich auf einem privaten PocketBase-Server (Deutschland, Übertragung per HTTPS verschlüsselt) abgelegt, damit du sie auf jedem Gerät verfügbar hast. Jeder Nutzer kann nur seine eigenen Daten lesen/schreiben (PocketBase-API-Regeln pro Nutzer). Kein Tracking, keine Weitergabe.

Kalkmanagement, Nährstoffmanagement und KH-Tester erfordern einen Account, weil Web und ESP über PocketBase synchronisieren.

ESP-Firmware bauen

Im Ordner esp-firmware/aquarium-rechner-esp/.

  • Board: ESP32-S3 N16R8 (16 MB Flash, 8 MB OPI PSRAM)
  • IDE: Arduino 2.x mit „ESP32 by Espressif Systems" Boards
  • Partition: 16M Flash (3MB APP/9.9MB FATFS)
  • Libraries: FastAccelStepper, ArduinoJson (v7), RTClib, Adafruit NeoPixel (kein extra Backend-Client nötig — Anbindung an PocketBase per HTTPS-REST)

Eine Firmware für alle Geräte. Welche Aufgabe ein ESP übernimmt, entscheidet seine Rolle (kalk, nutrient, khtest), die im Web-Interface pro Gerät zugewiesen wird — nicht ein eigener Build. Alle drei laufen auf derselben Platine; was die Rolle unterscheidet (Pumpenzahl und -namen, Rührer-PWM beim Tester, pH-Fenster), wird beim Boot anhand der Rolle gesetzt; siehe RoleConfig in config.h.

Neue Releases baut die CI (Forgejo Actions) automatisch: Version-Tag v* pushen → kompilierte .bin erscheint als Release-Asset auf https://git.reeftank.pro — der ESP holt sie sich per OTA. Details in FIRMWARE.md.

Werkzeuge

Alles unter tools/ — wird nicht ins Web gespiegelt (siehe deploy.list).

Seiten vor dem Deploy prüfen. Die Rechner sind je eine HTML-Datei mit einem grossen <script type="module">. Ein Syntaxcheck reicht dort nicht: eine undefinierte Variable in einem const-Literal ist syntaktisch tadellos und zerlegt die Seite trotzdem beim Laden — sichtbar erst, wenn jemand sie aufmacht.

python3 tools/check-inline.py nutrient/index.html

Das Skript löst die Importe heraus, ersetzt sie durch nachgiebige Stubs samt DOM-Attrappe und führt den Modulrumpf aus. Es braucht eine JS-Engine (node oder macOS-jsc) und meldet sichtbar, wenn es keine findet.

tools/deploy.sh ruft es serverseitig vor dem Spiegeln auf: fällt eine Seite durch, bricht der Deploy ab und pb_public bleibt auf dem vorigen Stand.

Tagesmail durchspielen. Der Server-Hook pb_hooks/container_alert.pb.js (Erinnerung „heute messen" + Kanister fast leer / leer, einmal morgens) läuft nur in der PocketBase-JSVM. Der Selbstcheck stellt sie nach, dreht die Uhr auf 8:07 und prüft Mails und Merker in einem Dutzend Fällen:

/System/Library/Frameworks/JavaScriptCore.framework/Versions/Current/Helpers/jsc tools/test-tagesmail.js

Lokal ansehen. Die Seiten laden ihre Module über absolute Pfade (/assets/...), die ein file://-Aufruf nicht auflöst — ohne Server sieht man deshalb keine Laufzeitfehler, sondern gar nichts.

python3 tools/devserver.py 8788

Danach http://localhost:8788/nutrient/ im Browser. (Bewusst nicht python3 -m http.server: dessen __main__ ruft os.getcwd() auf, was in manchen Sandboxes scheitert.)

Quellcode & Mitmachen

Der Quellcode liegt auf dem eigenen Git-Server: https://git.reeftank.pro (öffentlich lesbar/klonbar).

Lizenz

Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Du darfst das Material teilen und bearbeiten, sofern du:

  • Namensnennung vornimmst (Markus / markus629)
  • es nicht für kommerzielle Zwecke nutzt
  • abgeleitete Werke unter der gleichen Lizenz weitergibst

Vollständiger Lizenztext: LICENSE