from open_wearables import SensorDataset, load_recordingsPrimary internal package layers:
open_wearables.schemaopen_wearables.parsingopen_wearables.dataopen_wearables.ipc
OpenWearableIPCClient is an async JSON-RPC style client for
ws://127.0.0.1:8765/ws by default.
async with OpenWearableIPCClient() as client:
await client.ping()start_scan(check_and_request_permissions=True)start_scan_async(check_and_request_permissions=True) -> dictstart_scan_stream(check_and_request_permissions=True) -> StreamSubscriptionget_discovered_devices() -> list[DiscoveredDevice]connect_device(device_id, connected_via_system=False) -> WearableSummaryconnect_system_devices(ignored_device_ids=None) -> list[WearableSummary]list_connected() -> list[WearableSummary]disconnect(device_id)
client.synchronize_time(device_id)client.list_sensors(device_id) -> list[SensorInfo]client.list_sensor_configurations(device_id) -> list[SensorConfiguration]client.set_sensor_configuration(device_id, configuration_name=..., value_key=...)
Per-device handle:
wearable = client.wearable(device_id)
await wearable.connect()
await wearable.actions.synchronize_time()Use the typed stream helpers:
stream = await wearable.streams.sensor_values(sensor_id="accelerometer_0")
async for event in stream:
print(event.data)Other helpers:
wearable.streams.sensor_configuration()wearable.streams.button_events()wearable.streams.battery_percentage()wearable.streams.battery_power_status()wearable.streams.battery_health_status()wearable.streams.battery_energy_status()
Raw websocket-aligned methods:
store_sound(sound_id, audio_base64, codec=None, sample_rate=None, num_channels=None, interleaved=None, buffer_size=None)play_sound(sound_id, volume=None, codec=None, sample_rate=None, num_channels=None)
Python-friendly helpers:
store_sound_bytes(sound_id, audio_bytes, codec=None, sample_rate=None, num_channels=None, interleaved=None, buffer_size=None)store_sound_file(sound_id, file_path, codec=None, sample_rate=None, num_channels=None, interleaved=None, buffer_size=None)client.audio.store_sound(...)client.audio.store_sound_file(...)client.audio.play_sound(...)
Example:
async with OpenWearableIPCClient("ws://192.168.1.23:8765/ws") as client:
await client.audio.store_sound_file("beep_ok", "beep.wav")
await client.audio.play_sound("beep_ok", volume=1.0)High-level API for loading and analyzing a single .oe recording.
SensorDataset(filename: str, verbose: bool = False)filename: path to.oefile.verbose: enables parser diagnostic output.
Parsing happens during initialization.
filename: strsource file path.verbose: boolparser verbosity flag.parse_result: parser.ParseResultraw parse output.sensor_dfs: Dict[int, pandas.DataFrame]per-SID DataFrames.df: pandas.DataFramelazily built combined DataFrame.audio_stereo: Optional[numpy.ndarray]stereo audio frames (int16, shape(N, 2)).audio_df: pandas.DataFramecached audio DataFrame.
Sensor accessor attributes:
dataset.imudataset.barometerdataset.microphonedataset.ppgdataset.optical_tempdataset.bone_acc
Each accessor supports grouped and channel-level access (see data model docs).
Re-parses the recording file and updates parse_result.
Returns sensor names with non-empty DataFrames.
Returns one sensor DataFrame by name.
- Valid names:
imu,barometer,microphone,ppg,optical_temp,bone_acc - Raises
KeyErrorfor unknown names.
Returns the default sampling rate for a sensor name or SID when the file header
contains v3+ frequency metadata. Returns None for v2 files or sensors without
frequency metadata.
Returns default sampling rates for all known dataset sensors keyed by sensor
name. Values are None when metadata is unavailable.
Builds and caches a merged DataFrame across all non-empty sensor streams.
Returns timestamp-indexed audio DataFrame with columns:
mic.innermic.outer
Behavior:
- Uses the microphone sampling rate from v3+ file headers when available.
- Falls back to 48 kHz when no microphone sampling-rate metadata is present.
- Uses the caller-provided
sampling_rateas an explicit override. - Raises
ValueErrorifsampling_rate <= 0. - Returns empty DataFrame with expected columns if no mic packets exist.
- Caches by sampling rate.
Writes combined DataFrame to <recording_basename>.csv by delegating to save_csv().
Saves the combined DataFrame to CSV if self.df is non-empty.
Call get_dataframe() first to ensure self.df is populated.
Plays audio in IPython/Jupyter via IPython.display.Audio.
Writes WAV audio with scipy.io.wavfile.write.
load_recordings(file_paths: Sequence[str]) -> List[SensorDataset]Creates SensorDataset objects for existing files only.
Core classes and helpers for decoding binary packets:
Parser: stream parser over packetized binary data.PayloadParser: base parser interface.SchemePayloadParser: parser built fromSensorScheme.MicPayloadParser: parser for microphone payloads.ParseResult: parse container with per-SID DataFrames and microphone artifacts.interleaved_mic_to_stereo(samples): converts interleaved samples to stereo.mic_packet_to_stereo_frames(packet, sampling_rate): timestamp + stereo frame conversion.
Note: open_wearables.parser is a compatibility facade. New code should prefer
open_wearables.parsing.
Defines sensor schema primitives:
ParseTypeenumSensorComponentSchemeSensorComponentGroupSchemeSensorSchemebuild_default_sensor_schemes(sensor_sid)
Note: open_wearables.scheme is a compatibility facade. New code should prefer
open_wearables.schema.