# Auswerteplatz HRV

Auswertung der Handy-Aufnahmen am PC, angelehnt an Kubios HRV Scientific. Aufgenommen wird
weiter am Handy (HRV-App `at.maxel.hrv`, Rad-App `at.maxel.puls`), hier wird ausgewertet.

## Starten

Doppelklick auf **`Auswerteplatz starten.cmd`**. Das startet einen kleinen Server (nur auf
diesem Rechner erreichbar) und öffnet ein eigenes Edge-Fenster auf <http://localhost:8765>.
Braucht nur Node.js, keine weiteren Pakete.

## Daten vom Handy

Handy per USB anstecken (USB-Debugging an), im Auswerteplatz **„Vom Handy holen“**. Kopiert
werden nur neue oder gewachsene Dateien nach `daten/`:

| Handy | hier |
|---|---|
| `at.maxel.hrv/files/rest` | `daten/ruhe` |
| `at.maxel.hrv/files/free` | `daten/frei` |
| `at.maxel.hrv/files/ecg` | `daten/ekg` (Anzeige folgt) |
| `at.maxel.puls/files/sessions` | `daten/fahrt` |

Abschnitte je Aufnahme liegen in `daten/abschnitte/<id>.json`, die Personenangaben für den
Bericht in `daten/person.json`. `daten/` ist nicht im Git.

## Bedienung

- **Tachogramm:** ziehen legt einen Abschnitt an, an den Rändern ziehen verschiebt ihn, Klick
  wählt. Mausrad zoomt, Umschalt+Mausrad verschiebt, im Streifen darunter den Ausschnitt ziehen.
  Rote Punkte sind Kettenbrüche (Sprung über 20 % oder Lücke).
- **Ergebnisreiter:** Übersicht (mit PNS/SNS gegen die eigenen Morgen), Zeitbereich,
  Frequenzbereich, Nichtlinear — immer für den gewählten Abschnitt.
- **Zeitverlauf** (Reiter und „Zeitbericht“, zwei A4-Seiten) über die ganze Aufnahme: Puls mit
  Zonenstreifen und PNS/SNS je 2-min-Fenster, Spektrogramm mit Atemfrequenz, DFA α1 und RMSSD,
  LF/HF, Höhe, Zeit je Pulszone (gegen das Zonenprofil, das die Fahrt trägt), Anteile der
  PNS/SNS-Stufen, α1 je Pulsband mit der aeroben Schwelle (α1 = 0,75) wie in der Rad-App.
  Linien brechen an Gurtpausen ab.
- **Bericht:** zwei A4-Seiten je Abschnitt, „Drucken / als PDF“.
- **CSV:** alle Abschnitte der Aufnahme mit allen Kennzahlen, Semikolon und Dezimalkomma für Excel.

## Rechenweg

`web/hrv.js` ist eine Übertragung von `Hrv.kt`, `Autonomic.kt` und `Rest.kt` aus der PulsApp.
Formeln nach Lohninger und Eller-Berndl (Ordner `HRV/`); was dort nicht steht, ist in der
Anzeige mit † markiert und nach der Originalliteratur gerechnet.

Geprüft:

- `npm test` — rMSSD, Score und Puls aller Ruhemessungen gegen die Werte, die die App selbst in
  die Datei schreibt. Stand 24.10.2026: 19 von 19 exakt gleich.
- `test/gegen.py` + `test/gegen-python.mjs` — Spektrum (VLF/LF/HF, Atemfrequenz), Stressindex,
  SampEn und DC/AC gegen eine unabhängige scipy-Fassung; gleich bis 10⁻¹⁵.

- `node test/pruefe-zeitverlauf.mjs` — Zeit je Pulszone gegen `zoneSeconds` aller Fahrten
  (höchstens 0,54 % Abweichung, weil die Datei nur ganze Sekunden trägt, die App in ms zählt).
  Mit `test/zeitverlauf.py` dazu Spektrogramm und α1-Verlauf gegen numpy/scipy: gleich bis 10⁻¹¹.

`web/zeitverlauf.js` überträgt `Hrv.spectrogram`, `alphaCourse`, `bands`, `thresholdAt`
(Hrv.kt) und die Zonen aus Zones.kt/Session.kt. Neu: die Richtung einer nicht eingeschlossenen
Schwelle („über“/„unter“) und die PNS/SNS-Fenster (ab 60 Schlägen in Ketten, unter 10 %
Kettenbrüchen, gegen mindestens drei Vormorgen).

Bewusste Abweichung von der App: VLF lässt die 0-Hz-Stufe aus (sie ist nur der Rest des
Abschnittsmittels). LF, HF und alles Übrige sind unverändert.

## Vergleichswerte

`referenz/ans-tests-vergleichswerte.md` — Altersnormen für tiefe Atmung, Aufstehtest und
Valsalva, für den späteren Atem- und Aufstehtest.
