A personal iOS/Android app for tracking blood pressure readings. Supports Bluetooth sync with compatible blood pressure monitors and manual entry. Generates printable PDF reports for clinician visits.
Built with React Native + Expo (TypeScript).
| Manufacturer | Model | Connection | Notes |
|---|---|---|---|
| Omron | BP7150 (HEM-7150T) | Bluetooth (no pairing) | Reads up to 60 stored readings via custom GATT protocol over service 0000fe4a |
- Node.js (LTS recommended)
- Expo CLI
- For iOS: Xcode and a physical device (BLE does not work in the simulator)
- For Android: Android Studio and a physical device
git clone https://github.com/vinibaggio/open-bpm.git
cd open-bpm
npm installnpm start # Start Expo dev server
npx expo run:ios --device "Your Device Name" # Build and deploy to iOS device
npx expo run:android --device # Build and deploy to Android devicenpm test # Run all tests (Jest)
npx jest path/to/test # Run a single test file
npm run typecheck # TypeScript type checkingsrc/
├── types/ TypeScript interfaces (Reading, etc.)
├── utils/ Pure utilities (BP classification, thresholds, colors)
├── services/
│ ├── ble/ Omron BLE protocol: scan, connect, EEPROM read, record parsing
│ ├── database/ SQLite setup and reading CRUD
│ └── report/ HTML report generator for PDF export
├── screens/ Tab screens: ReadingList, Manual Entry, Report
├── components/ Reusable UI components (ReadingRow, ReadingForm)
└── navigation/ Bottom tab navigator
The app is designed to support multiple BLE blood pressure monitors. Each device gets its own service module. To add a new device:
-
Create a new service directory under
src/services/(e.g.,src/services/ble-withings/). -
Implement the BLE protocol for your device. Your module needs to:
- Scan for and connect to the device
- Read stored measurements from the device
- Return an array of
Readingobjects withsource: 'ble'
The
Readinginterface (src/types/reading.ts):interface Reading { id: string; // UUID systolic: number; diastolic: number; heartRate: number | null; timestamp: string; // ISO 8601 — must come from the device's stored timestamp notes: string | null; source: 'manual' | 'ble'; }
Important: The
timestampmust be decoded from the device's stored data, not the time of import. Duplicate detection relies on timestamps to avoid re-importing readings. -
Wire it up in the UI. Add a sync button or auto-detection in
ReadingListScreen(src/screens/ReadingListScreen.tsx). -
Update the supported devices table in this README.
Use the existing Omron implementation in src/services/ble/ as a reference. Key files:
types.ts— GATT UUIDs, constants, memory layoutomronProtocol.ts— packet framing, CRC, commandsomronParser.ts— extracts BP readings from raw EEPROM datableSync.ts— high-level scan/connect/fetch/import orchestration
- Run
npm testandnpm run typecheckbefore submitting changes - BP classification follows AHA guidelines — see
src/utils/bloodPressure.ts - BLE debug logging uses prefixed tags:
[BLE:Sync],[BLE:Protocol],[BLE:Parser]
The Omron BP7150 Bluetooth implementation is based on the protocol reverse-engineering work from:
- omblepy by userx14 — Python library for communicating with Omron BLE blood pressure monitors
- ubpm by LazyT — Universal blood pressure monitor tool
Their work documenting the Omron custom GATT protocol, EEPROM memory layout, and packet framing made the BLE sync feature possible.
MIT License. See LICENSE for details.