MioConnect Integration
RPM device gateway for cellular-connected medical device telemetry
Overview
MioConnect is the RPM device gateway for the Vantrexia platform. It manages telemetry from cellular-connected medical devices, enabling continuous remote patient monitoring without requiring Bluetooth pairing to a smartphone.
Patients take readings at home using cellular-enabled medical devices. Data transmits automatically via a cellular hub to the MioConnect cloud, which forwards measurements to Vantrexia in real time via secure webhooks.
MioConnect supports these device categories for RPM programs:
- Blood Pressure Monitors — Systolic, diastolic, pulse readings
- Weight Scales — Body weight measurements in lbs/kg
- Glucose Meters — Blood glucose levels in mg/dL
- Pulse Oximeters — SpO2 percentage and pulse rate
Supported Devices
Vantrexia supports the following MioConnect-certified devices. All devices connect via a cellular hub and require no patient smartphone interaction.
| Device Type | Model | Connectivity | Measurements |
|---|---|---|---|
| Blood Pressure Gen1 | A&D UA-651BLE | Bluetooth → Cellular Hub | Systolic (mmHg), Diastolic (mmHg), Pulse (bpm) |
| Blood Pressure Gen2 | A&D UA-767PBT-Ci | Bluetooth → Cellular Hub | Systolic (mmHg), Diastolic (mmHg), Pulse (bpm), Irregular Heartbeat Detection |
| Weight Scale Gen1 | A&D UC-352BLE | Bluetooth → Cellular Hub | Weight (lbs/kg) |
| Weight Scale Gen2 | A&D UC-355PBT-Ci | Bluetooth → Cellular Hub | Weight (lbs/kg), BMI (when height configured) |
| Glucose Meter | OneTouch Verio Flex | Bluetooth → Cellular Hub | Blood Glucose (mg/dL), Meal marker (pre/post) |
| Pulse Oximeter | Nonin 3230 | Bluetooth → Cellular Hub | SpO2 (%), Pulse Rate (bpm) |
Devices are assigned to patients via the MioConnect portal or through Vantrexia's device management API. Each device is linked to a specific patient ID and cannot produce readings until properly provisioned.
Architecture
The MioConnect integration follows a unidirectional data flow from device to clinical observation:
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Medical │ │ Cellular │ │ MioConnect │
│ Device │───▶│ Hub │───▶│ Cloud │
│ (BLE) │ │ (LTE/4G) │ │ (AWS) │
└──────────────┘ └──────────────┘ └────────┬─────────┘
│
Webhook POST
(HMAC-SHA256)
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ FHIR │ │ Observation │ │ Vantrexia │
│ Resource │◀───│ Model │◀───│ Backend │
│ (R4) │ │ (Django) │ │ (Webhook EP) │
└──────────────┘ └──────────────┘ └──────────────────┘
Pipeline Stages
- Device Measurement — Patient takes a reading on the medical device (e.g., blood pressure cuff)
- BLE Transmission — Device sends data via Bluetooth Low Energy to the nearby cellular hub
- Cellular Upload — Hub transmits the reading over LTE/4G to MioConnect's cloud infrastructure
- Webhook Delivery — MioConnect sends an authenticated POST request to the Vantrexia webhook endpoint
- Observation Creation — Vantrexia validates the payload and creates an
Observationmodel instance - FHIR Transformation — The observation is transformed into a FHIR R4
Observationresource for interoperability
End-to-end latency from device reading to Vantrexia observation is typically 30–90 seconds. Factors include BLE pairing time, cellular signal strength, and webhook delivery. Readings are timestamped at the device level to ensure clinical accuracy.
Configuration
Setting up the MioConnect integration requires configuration in both the MioConnect portal and the Vantrexia backend.
1. MioConnect Portal Credentials
Obtain the following from your MioConnect account representative:
# MioConnect Integration
MIOCONNECT_API_KEY=your_api_key_here
MIOCONNECT_API_SECRET=your_api_secret_here
MIOCONNECT_ORGANIZATION_ID=your_org_id
MIOCONNECT_WEBHOOK_SECRET=your_webhook_shared_secret
MIOCONNECT_BASE_URL=https://api.mioconnect.com/v2
2. Webhook URL Setup
Configure the webhook endpoint in the MioConnect portal to point to your Vantrexia backend instance:
POST https://api.yourdomain.com/api/v1/mio/webhook/
3. SSL Certificate Requirements
MioConnect requires a valid SSL certificate on the webhook endpoint:
- TLS 1.2 or higher (TLS 1.3 recommended)
- Certificate must be issued by a trusted CA (no self-signed certificates)
- If using Cloudflare, enable Full (Strict) SSL mode
- Certificate must cover the exact domain used in the webhook URL
4. IP Whitelisting
Whitelist the following MioConnect IP ranges in your firewall or security group:
# MioConnect Production IPs
52.22.140.0/24
52.22.141.0/24
34.205.120.0/24
# MioConnect Staging IPs (for testing)
52.22.142.0/24
Ensure MIOCONNECT_ENABLED = True is set in your Django settings. The webhook endpoint is automatically registered when the mio_integration app is included in INSTALLED_APPS.
Webhook Integration
MioConnect delivers device readings to Vantrexia via authenticated webhook POST requests.
Endpoint
POST /api/v1/mio/webhook/
Content-Type: application/json
X-Mio-Signature: sha256=<HMAC-SHA256 signature>
X-Mio-Timestamp: 1738000000
Authentication
Every webhook request is authenticated using an HMAC-SHA256 signature sent in the X-Mio-Signature header. Vantrexia validates this signature before processing the payload:
import hmac
import hashlib
def verify_mio_signature(payload_body: bytes, secret: str, signature: str) -> bool:
"""Verify the HMAC-SHA256 signature from MioConnect webhook."""
expected = hmac.new(
key=secret.encode('utf-8'),
msg=payload_body,
digestmod=hashlib.sha256
).hexdigest()
received = signature.replace('sha256=', '')
return hmac.compare_digest(expected, received)
Payload Format
The webhook payload is a JSON object containing the device reading:
{
"event_type": "measurement.created",
"device_id": "MIO-BP2-00A4F1",
"patient_id": "pat_abc123def456",
"measurement_type": "blood_pressure",
"values": {
"systolic": 128,
"diastolic": 82,
"pulse": 72,
"irregular_heartbeat": false
},
"unit": "mmHg",
"timestamp": "2026-02-09T08:30:00Z",
"device_model": "UA-767PBT-Ci",
"battery_level": 85,
"signal_strength": -67,
"hub_id": "HUB-CEL-0042"
}
Supported Event Types
| Event Type | Description |
|---|---|
measurement.created |
New device reading received |
device.connected |
Device paired with hub successfully |
device.disconnected |
Device lost connection with hub |
device.battery_low |
Device battery below 20% |
hub.offline |
Cellular hub went offline |
Retry Policy
MioConnect implements automatic retries for failed webhook deliveries:
- Maximum retries: 3 attempts
- Backoff strategy: Exponential backoff — 1 min, 5 min, 15 min
- Success criteria: HTTP 200 response within 10 seconds
- Failure action: After 3 failures, the event is queued and an alert is sent to the MioConnect dashboard
Webhook deliveries may be retried. Always process webhooks idempotently using the device_id + timestamp combination as a deduplication key to prevent duplicate observations.
Operating Modes
MioConnect can operate in two modes depending on your practice's preferences and technical capacity.
Managed Mode Recommended
In Managed Mode, Vantrexia handles the full device lifecycle:
- Device Provisioning — Devices are ordered, configured, and assigned to patients through the Vantrexia dashboard
- Patient Assignment — Linking a device to a patient is done via the patient management UI or API
- Firmware Updates — Vantrexia coordinates OTA firmware updates with MioConnect automatically
- Replacement Workflow — Defective devices are flagged and replacement orders are initiated through the platform
- Inventory Tracking — Track device stock levels, assignments, and returns from the admin panel
import requests
response = requests.post(
"https://api.yourdomain.com/api/v1/devices/assign/",
headers={"Authorization": "Bearer <token>"},
json={
"device_id": "MIO-BP2-00A4F1",
"patient_id": "pat_abc123def456",
"device_type": "blood_pressure",
"shipping_address": "123 Main St, Suite 4, Anytown, US 12345"
}
)
# Returns: {"status": "assigned", "estimated_delivery": "2026-02-12"}
Self-Managed Mode
In Self-Managed Mode, the practice manages devices directly through the MioConnect portal:
- Device Provisioning — Practice staff configure devices in the MioConnect portal
- Patient Assignment — Devices are linked to patients using MioConnect's patient_id mapping
- Firmware Updates — Managed independently via the MioConnect admin console
- Vantrexia receives data only — The platform acts as a data consumer, processing incoming webhooks without managing device state
Managed Mode is recommended for most practices as it simplifies operations and provides a unified experience. Self-Managed Mode is best for large organizations with existing MioConnect infrastructure and dedicated IT teams.
Monitoring & Alerts
Vantrexia provides comprehensive monitoring for all connected MioConnect devices to ensure continuous care delivery.
Device Connectivity Monitoring
The system tracks the online/offline status of every device and hub in real time:
- Hub heartbeat — Cellular hubs send a heartbeat every 5 minutes. If no heartbeat is received for 15 minutes, the hub is marked offline.
- Device last-seen — Each device's last transmission timestamp is tracked. Devices with no reading in 24 hours are flagged.
Battery Status
Battery levels are reported with each measurement. Vantrexia generates alerts at these thresholds:
| Battery Level | Status | Action |
|---|---|---|
| > 20% | Normal | No action required |
| 10–20% | Low | Dashboard warning, email notification to care team |
| < 10% | Critical | Urgent alert, replacement initiated (Managed Mode) |
Missed Readings Detection
Vantrexia monitors patient compliance by detecting missed readings based on their prescribed schedule:
- Patients assigned daily readings receive a missed reading alert if no measurement is received by the end of the day
- The care team is notified via dashboard alerts and optional push notifications
- Consecutive missed days are escalated with increasing urgency in triage
Stale Data Alerts
If a device transmits the exact same readings repeatedly (e.g., identical weight 5 days in a row), Vantrexia flags this as potentially stale data — which may indicate a device malfunction or the device is not being used by the patient.
Troubleshooting
- Check that the cellular hub is powered on and the LED indicator shows a solid green light
- Verify the hub has cellular signal — move it near a window if signal is weak
- Confirm the device is within Bluetooth range of the hub (typically 10–30 feet)
- Power cycle both the device and the hub
- Check the MioConnect portal for hub connectivity status
- If the hub remains offline, contact MioConnect support for a replacement
- Verify the webhook URL is correct in the MioConnect portal
- Check that the SSL certificate is valid and not expired
- Confirm the Vantrexia backend is accessible from MioConnect IPs (check firewall rules)
- Verify the
MIOCONNECT_WEBHOOK_SECRETenvironment variable matches the shared secret in the MioConnect portal - Check backend logs for signature verification errors:
docker-compose logs backend | grep "mioconnect" - Test the endpoint manually:
curl -X POST https://api.yourdomain.com/api/v1/mio/webhook/ \ -H "Content-Type: application/json" \ -H "X-Mio-Signature: sha256=test" \ -d '{"event_type": "test"}'
- Verify the device is calibrated — medical devices should be validated annually
- Check that the patient is using the device correctly (e.g., proper cuff placement for BP monitors)
- Compare the reading in Vantrexia with the raw payload in the webhook logs:
docker-compose exec backend python manage.py shell -c " from apps.mio_integration.models import MioWebhookLog logs = MioWebhookLog.objects.filter(device_id='MIO-BP2-00A4F1').order_by('-created_at')[:5] for log in logs: print(log.payload) " - Check for timezone discrepancies between the device timestamp and server time
- Verify the unit conversion is correct (some devices may report in non-standard units)
- If readings are consistently off, submit a device replacement request
Duplicate observations can occur when MioConnect retries a webhook delivery. The deduplication logic uses device_id + timestamp as a unique key.
- Check if the webhook endpoint is responding slowly (>10 seconds triggers a retry)
- Verify the deduplication logic is enabled in settings:
# settings.py MIOCONNECT_DEDUP_ENABLED = True MIOCONNECT_DEDUP_WINDOW_SECONDS = 300 # 5-minute window - Manually remove duplicate observations via the admin panel or API