Zum Inhalt

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

1. Global (Set): currentZone = "unknown" (Persisted)

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 currentZone Global 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=30 in jeder Zone-Action damit Disconnect nicht "Resting Zone" triggert

Quellen