Heart Rate Zones — Trigger bei Schwellwerten¶
Reagiere auf besondere Heart-Rate-Werte: Stress-Modus über 150, Calm-Mode unter 60, Recovery-Phase nach Spike. Mit eingebautem Range-Filter pro Action.
Voraussetzung: HypeRate/Pulsoid verbunden + OBS optional Patterns: Heart Rate Trigger mit Range-Filter + If/Else + Globals (Edge-Detection) Sub-Actions: je nach Use-Case 3-8
Strategie: Eine Action pro Zone¶
Statt einer großen Action mit If/Else-Cascade, lieber mehrere Actions mit jeweils eigenem Range-Filter im Trigger. Das ist sauberer und performanter.
Beispiel: 4 Zonen¶
| Action | Trigger-Filter | Was sie tut |
|---|---|---|
[HR] Resting Zone |
Min 40 Max 70 |
Calm-Music, Resting-Overlay |
[HR] Active Zone |
Min 70 Max 130 |
Normal-Mode |
[HR] High Zone |
Min 130 Max 170 |
"Spannung steigt"-Effekte |
[HR] Critical Zone |
Min 170 Max 220 |
Stress-Modus an |
Problem: Trigger feuert jede Sekunde¶
Wenn HR konstant bei 152 ist, feuert [HR] High Zone JEDE Sekunde. Du willst aber nur EINMAL beim Übergang reagieren — nicht permanent. Lösung: Edge-Detection mit Global.
Edge-Detection Pattern¶
[HR] High Zone (Trigger: Heart Rate Pulse, Min=130 Max=170)
├── 1. Global (Get): currentZone (Persisted) → previousZone
├── 2. If/Else: %previousZone% Equals "high"
│ └── Break (Schon in High-Zone, nichts tun)
├── 3. Global (Set): currentZone = "high" (Persisted)
└── 4. (jetzt die Zone-Change-Action — Sound, OBS-Source, etc.)
Bei jedem Pulse wird gecheckt: sind wir gerade NEU in dieser Zone? Falls ja → Action laufen. Sonst → Break.
Beispiel: Critical Zone (Stress-Modus)¶
[HR] Critical Zone (Trigger: Heart Rate Pulse, Min=170 Max=220)
├── 1. Global (Get): currentZone (Persisted) → previousZone
├── 2. If/Else: %previousZone% Equals "critical"
│ └── Break
├── 3. Global (Set): currentZone = "critical" (Persisted)
├── 4. Send Message: "🚨 Stress-Modus! Streamer-Puls bei %heartRate% BPM"
├── 5. Set Source Visibility: "StressOverlay" = Visible
├── 6. Play Sound: alarm.mp3 (volume 40%)
└── 7. Set Active Scene: "Intense" (optional)
Beim ersten Pulse über 170 wird der Stress-Modus aktiviert. Beim zweiten Pulse über 170 macht die Action nichts (weil schon in critical).
Beispiel: Recovery-Detection¶
Wenn HR von >170 zurück auf <140 fällt → Recovery-Phase erkennen.
Action: [HR] Recovery Phase¶
Trigger: Min 60 Max 140
1. Global (Get): currentZone (Persisted) → previousZone
2. If/Else: %previousZone% Equals "critical"
├── (Recovery von Critical!)
├── Send Message: "💆 @%broadcastUser% chillt wieder, %heartRate% BPM"
├── Set Source Visibility: "StressOverlay" = Hidden
├── Set Active Scene: "Main"
├── Global (Set): currentZone = "active"
└── Break
3. Global (Set): currentZone = "active"
Reset bei Stream-Start¶
Damit currentZone nicht zwischen Streams hängenbleibt:
Action: [Sys] Stream Online — Reset HR State¶
Trigger: Twitch → Channel → Stream Online
So beginnt jeder Stream mit clean state.
Verwendungsbeispiele¶
| Situation | Zone | Resultat |
|---|---|---|
| Game läuft chill, HR 80 | active | Nichts (passive Display) |
| Boss-Fight startet, HR 145 | high | "Spannung steigt"-Overlay einmalig |
| Final-Hit, HR 175 | critical | Stress-Modus an, Alarm |
| Boss besiegt, HR fällt auf 95 | active (recovery) | "Chillt wieder"-Message |
Erweiterung: Persistent HR-Stats¶
Plus Min/Max/Avg tracken pro Stream — siehe heart-rate-stats.md.
Erweiterung: Chat-Reaktion auf Spikes¶
Wenn HR plötzlich um >30 BPM steigt = wahrscheinlich Schock-Moment:
[HR] Spike Detection (Trigger: Heart Rate Pulse, jeder Pulse)
├── 1. Global (Get): lastHR → previous
├── 2. Set Argument: diff = $sub(%heartRate%, %previous%)$
├── 3. If/Else: %diff% Greater Than 30
│ ├── Send Message: "📈 %heartRate% BPM — was war das gerade?"
│ └── (don't break, continue zur regulären Logic)
└── 4. Global (Set): lastHR = %heartRate%
Häufige Fallen¶
- Zone-Change-Spam ohne Edge-Detection — ohne
currentZoneGlobal würde Stress-Sound jede Sekunde abspielen. Edge-Detection ist Pflicht - Reset bei Stream-Start vergessen — currentZone bleibt vom letzten Stream → ggf. falsche Initial-Reaction
- Zone-Range-Overlap — wenn zwei Actions Range 100-150 und 130-170 haben, beide feuern bei 140. Vermeiden: klare Bereiche ohne Overlap
- HR-Disconnect = HR auf 0 — filter
Min=30in jeder Zone-Action damit Disconnect nicht "Resting Zone" triggert
Quellen¶
- Heart Rate Triggers: setup.md
- Globals Pattern: patterns/03-globals.md
- If/Else Pattern: patterns/02-if-else.md