FAC-MOCAREV-001 · IWR6843AOP · Phase I Pilot

Simulation
Lab.

Generate 24-hour behavioral datasets for the 12-room Mount Olivet Careview Home pilot. Launch simulations, monitor the AWS pipeline end-to-end, and verify data arrives on resident dashboards.

36
devices
1 fps
per device
0.09M
frames / device / day
0.1 GB
parquet / day / pilot
6
clinical scenarios
Ella AI Nurse Assistant
www.ellamemory.com
00

Simulation Console

Select a scenario · configure parameters · launch · watch the pipeline
Normal Day
BASELINE
18 fps baseline — typical memory-care resident patterns throughout the day.
● SELECTED
Fall Event
CLINICAL
Bathroom fall at 03:00 — AmbientPosture "On Floor", prolonged floor occupancy.
Night Wandering
CLINICAL
High entry + living room activity 01:00–04:00. Agitation or elopement-risk pattern.
Isolation Day
CLINICAL
Near-zero activity all zones all day. Early withdrawal or illness — triggers alert.
Sundowning
CLINICAL
Extreme living room + entry spike 16:00–19:00. Classic late-day agitation pattern.
Care Visit Day
WORKFLOW
Structured check-ins at 10:00, 14:00, 18:00 — entry + living room engagement spikes.
Date
Rooms
Pipeline Status
Generator
Python / Lambda
idle
S3 raw/
Parquet frames
idle
Golden λ
UNLOAD combine
idle
Athena
View refresh
idle
ellamemory
Dashboard live
idle
01

Pilot Roster

12 rooms · FAC-MOCAREV-001 · Mount Olivet Careview Home
301
MOCAREV-0001
ella →
A
B
C
raw
golden
302
MOCAREV-0002
ella →
A
B
C
raw
golden
303
MOCAREV-0003
ella →
A
B
C
raw
golden
304
MOCAREV-0004
ella →
A
B
C
raw
golden
305
MOCAREV-0005
ella →
A
B
C
raw
golden
306
MOCAREV-0006
ella →
A
B
C
raw
golden
307
MOCAREV-0007
ella →
A
B
C
raw
golden
308
MOCAREV-0008
ella →
A
B
C
raw
golden
309
MOCAREV-0009
ella →
A
B
C
raw
golden
310
MOCAREV-0010
ella →
A
B
C
raw
golden
311
MOCAREV-0011
ella →
A
B
C
raw
golden
312
MOCAREV-0012
ella →
A
B
C
raw
golden
02

Activity Preview

Normal Day scenario · 24-hour behavioral model
Compare with
WakingReturnedSundowningSundowningSundowningSundowningEveningEveningLIVING ROOMNight tripNight tripNight tripHygieneHygieneVisitVisitPre-dinnerEve hygienePre-bedBATHROOMCare check-inDeparture ↗Return ↙Care check-inCare check-inLunch ↗ ↙SundowningSundowningSundowningSundowningCare check-inCare check-inENTRY12am3am6am9am12pm3pm6pm9pm
Living Room
Bathroom
Entry
opacity = activity intensity · each column = 1 hour
Night 22:00–06:00
  • Asleep, low activity
  • 3× overnight bathroom trips (01h, 03:30h, 05h)
  • Entry near-zero; no staff visits
Day 06:00–15:00
  • Morning care: hygiene + standing
  • Absent at dining 07:45–08:15, 11:45–12:30
  • Staff check-ins every ~2h on entry zone
Sundowning 15:00–19:00
  • Living room activity spikes 25–40 counts
  • Entry zone: repeated door-checking bursts
  • Bathroom mostly empty during agitation
03

Device Configuration

3 zones · 1 device per zone · IWR6843AOP mmWave radar
Living Room
Device IDDEV-MOH-301-A
Mountwall_mount_6m
Zone keyliving_room
FPS1
SuffixA
Zone color0,113,227
Bathroom
Device IDDEV-MOH-301-B
Mountroof_mount
Zone keybathroom
FPS1
SuffixB
Zone color180,83,9
Entry
Device IDDEV-MOH-301-C
Mountwall_mount_corner
Zone keyentry
FPS1
SuffixC
Zone color91,33,182
04

How to Run

scripts/generate_sim_frames.py · ambientcloud repo · Python 3.12+
STEP 01Authenticate to AWS
eval "$(./scripts/resolve_env.sh dev)"
export AWS_PROFILE=pilot AWS_DEFAULT_REGION=us-east-1

# Verify access
aws sts get-caller-identity
STEP 02Dry-run (validates schema, prints frame counts, skips S3 upload)
python3 scripts/generate_sim_frames.py --fps 18 --dry-run
# Output: 36 devices × 1,555,200 frames × 160 bytes ≈ 8.5 GB raw
#         Parquet+ZSTD: ~197 MB for full pilot · day
STEP 03Generate full 12-room pilot at 18 fps
python3 scripts/generate_sim_frames.py --fps 18
# Writes to s3://ambient-dev-parquet-<acct>/raw/date={today}/...
# One file per device: raw/date=.../facility=.../subject=.../device=.../sim_frames.parquet
STEP 04Generate with a clinical scenario
python3 scripts/generate_sim_frames.py --fps 18 --scenario fall
# Available: normal | fall | wandering | isolation | sundowning | care_visit
# Modifies AmbientPosture, AmbientActivityCounts per scenario model
STEP 05Trigger golden combine (merges 3 zone files per room)
aws lambda invoke \
  --function-name ambient-dev-golden-combine \
  --payload '{"date":"2026-05-19"}' \
  --cli-binary-format raw-in-base64-out \
  /tmp/golden-out.json

cat /tmp/golden-out.json
# {"date":"2026-05-19","combined":12,"skipped":0}
STEP 06Verify golden files + Athena smoke query
aws s3 ls s3://ambient-dev-parquet-<acct>/golden/date=2026-05-19/ --recursive

aws athena start-query-execution \
  --query-string "SELECT COUNT(*) FROM ambient_dev_raw.golden_frames WHERE date='2026-05-19' AND facility='FAC-MOCAREV-001' AND subject='MOCAREV-0001'" \
  --work-group ambient-dev-analytics \
  --query-execution-context Database=ambient_dev_raw
05

Golden Parquet

AWS golden-combine Lambda · merges 3 zone files → 1 room file · powers ellamemory.com
Per-device (raw/)
DEV-MOH-301-ALiving Room
DEV-MOH-301-BBathroom
DEV-MOH-301-CEntry
14-column Schema V2 · no zone column · device partition in S3 path only
Golden (golden/)
golden_frames
14 columns + zone string
partition: date / facility / subject
UNION ALL of A + B + C
v_ambient_activity_index
SUM(ActivityCounts) per minute
v_zone_activity
Per-zone rows, filterable
Golden S3 Path
s3://ambient-dev-parquet-data/golden/date=2026-05-24/facility=FAC-MOCAREV-001/subject=MOCAREV-0001/ *.parquet
Athena UNLOAD writes multiple shards per subject. Partition projection on date/facility/subject — no device partition.
06

Athena Query Playground

Pre-built queries · live execution when AWS credentials configured
Date
SUM of AmbientActivityCounts per minute for one resident
sql
SELECT minute, AmbientActivityIndex, AmbientOccupancy, AmbientPosture
FROM ambient_dev_raw.v_ambient_activity_index
WHERE date='2026-05-24'
  AND facility='FAC-MOCAREV-001'
  AND subject='MOCAREV-0001'
ORDER BY minute;
Configure AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY in Vercel env settings to run queries live.
07

Cost Model

12 rooms · 36 devices · us-east-1 pricing · daily run cadence
ServiceFormulaPer runPer month (daily runs)
S3 PUT requests36 files × $0.000005<$0.001$0.005
S3 Storage (raw+golden)0.06 GB × 2 × $0.023$0.081
Lambda golden-combine600s × 256 MB × $0.0000167/GB-s$0.003$0.075
Athena scan0.050 GB × $5/TB<$0.001$0.007
TOTAL$0.003$0.169/mo
08

Data Volume

At 1 fps sustained · us-east-1 pricing
MetricPer devicePer room (3 devices)Full pilot (36 devices)
Frames / day86K259K3.11M
Raw JSON / day13 MB40 MB0.5 GB
Gzip NDJSON / day2 MB6 MB0.1 GB
Parquet+ZSTD / day2 MB5 MB0.1 GB
Parquet / month50 MB0.1 GB1.8 GB
09

CLI Reference

scripts/generate_sim_frames.py · ambientcloud repo
zsh
# Prerequisites
eval "$(./scripts/resolve_env.sh dev)"
export AWS_PROFILE=pilot AWS_DEFAULT_REGION=us-east-1

# Dry-run first
python3 scripts/generate_sim_frames.py --fps 18 --dry-run

# Full 12-room pilot at 18 fps
python3 scripts/generate_sim_frames.py --fps 18

# Specific rooms, custom date, scenario
python3 scripts/generate_sim_frames.py --rooms 301 302 303 --date 2026-05-19 --scenario fall

# Registry entries only (re-sync after DynamoDB changes)
python3 scripts/generate_sim_frames.py --registry-only
S3 Partition Path
s3://ambient-dev-parquet-data/raw/date=2026-05-24/facility=FAC-MOCAREV-001/subject=MOCAREV-0001/device=DEV-MOH-301-A/sim_frames.parquet
Partition columns (date / facility / subject / device) are path components only — not stored in the Parquet file body. Athena reads them via partition projection.
10

Frame Schema V2

15 data columns + 4 partition columns · ZSTD compression
FieldTypeDescription
captured_attimestamp(us, UTC)UTC frame timestamp, microsecond precision
device_idstringDEV-MOH-{room}-{A|B|C}
frame_numberint64Monotonic counter from device boot
point_xlist<float32>X coordinates of radar point cloud
point_ylist<float32>Y coordinates (depth from sensor)
point_zlist<float32>Z coordinates (height)
point_velocitylist<float32>Radial velocity per point (m/s)
point_snrlist<float32>Signal-to-noise ratio per point (dB)
track_idslist<int32>Tracker-assigned person IDs
track_max_zlist<float32>Max height per tracked person
track_min_zlist<float32>Min height per tracked person
AmbientActivityCountsint32Total radar points in this frame
AmbientOccupancyint32Persons tracked; 0=empty, 2+=visitor
AmbientPosturestring (nullable)Standing · Seated · On Floor · null
Partition columns — path only, not in file body
datestringe.g. 2026-05-19
facilitystringe.g. FAC-MOCAREV-001
subjectstringe.g. MOCAREV-0001
devicestringe.g. DEV-MOH-301-A