File size: 1,243 Bytes
34cb656 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | """Server-side pH simulation for the real-hardware prototype.
The current BioPatch prototype (ESP32-C3 + DHT11) measures temperature and
humidity only — it has no pH electrode yet. Rather than block the end-to-end
demo, we synthesise a plausible wound pH so the risk engine has all three
channels. This is a *labelled simulation*, never presented as a real
measurement: every reading it feeds is flagged ``ph_simulated=true`` and the
value stays inside a healthy, mildly-acidic granulating-wound band.
Deliberately independent of the live temperature/humidity so that warming or
breathing on the sensor (which legitimately moves the real channels) can never
manufacture a fake alkaline "infection signature" through the pH channel.
"""
from __future__ import annotations
import random
# Healing wound surface pH sits slightly acidic; alkaline drift is the
# infection marker we do NOT want to counterfeit here.
_PH_BASELINE = 6.0
_PH_NOISE_SD = 0.12
_PH_MIN = 5.6
_PH_MAX = 6.6
def simulate_ph(rng: random.Random | None = None) -> float:
"""Return a plausible, clearly-simulated wound pH (~5.6–6.6)."""
r = rng or random
value = r.gauss(_PH_BASELINE, _PH_NOISE_SD)
return round(max(_PH_MIN, min(_PH_MAX, value)), 2)
|