{"id":15292,"date":"2025-12-13T11:56:49","date_gmt":"2025-12-13T11:56:49","guid":{"rendered":"https:\/\/manual.m-path.io\/?post_type=ht_kb&#038;p=15292"},"modified":"2026-05-18T19:51:31","modified_gmt":"2026-05-18T19:51:31","slug":"wearables-garmin-direct-integration","status":"publish","type":"ht_kb","link":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/knowledge-base\/wearables-garmin-direct-integration\/","title":{"rendered":"Wearables (Garmin Direct Integration)"},"content":{"rendered":"\n<p>The <strong>Direct Garmin integration<\/strong> in m-Path enables researchers to collect continuous physiological measurements directly from participants&#8217; Garmin smartwatches. Unlike the standard wearable integration, this feature provides direct communication between the m-Path Sense app and Garmin devices, allowing for higher-resolution data collection and trigger-based interventions.<\/p>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-alert\">The Direct Garmin integration is available as an add-on. <a href=\"mailto:contact@m-path.io\">Contact us<\/a> to enable this feature<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key Features<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Raw data collection<\/strong> with customizable sampling rates (measure and device dependent).<\/li>\n\n\n\n<li><strong>Privacy-friendly:<\/strong> Participant data is transferred directly from the watch to the m-Path Sense app, no third-party integrations or apps required.<\/li>\n\n\n\n<li><strong>Trigger-based interventions:<\/strong> Enables you to create conditions that trigger notifications or questionnaires based on Garmin data.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-info\">If you need high-resolution Garmin data but don&#8217;t need the app to run continuously in the background or trigger interventions based on sensor values, the <a href=\"https:\/\/manual.m-path.io\/knowledge-base\/wearables-garmin-lite\/\">Garmin Lite integration<\/a> may be a better fit. It uses a lightweight sync item without requiring background sensing. Not sure which integration fits your study? check <a href=\"https:\/\/manual.m-path.io\/knowledge-base\/which-wearable-integration-is-right-for-my-project\/\">here<\/a> for an overview of the different smartwatch integrations possible in m-Path<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Setting Up Direct Garmin Integration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Create a Garmin sensing setup<\/h3>\n\n\n\n<p>To begin collecting data from Garmin devices, create an <strong>interaction<\/strong> and add a <strong>Sensing setup<\/strong> item from the m-Path dashboard. Then enable the Garmin sensors you want for your study.<\/p>\n\n\n\n<p>The <strong>&#8220;Garmin High Heart Rate and High Stress Trigger&#8221;<\/strong> item is available as an example in the interaction library. For background information on sensing concepts and configuration, see the <a href=\"https:\/\/manual.m-path.io\/knowledge-base\/mobile-sensing-full\/\">Mobile Sensing<\/a> manual.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" src=\"\/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-1024x714.png\" alt=\"Garmin sensing setup screenshot\" class=\"wp-image-15334\" srcset=\"\/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-1024x714.png 1024w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-300x209.png 300w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-768x536.png 768w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-50x35.png 50w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-1536x1072.png 1536w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-2048x1429.png 2048w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-60x42.png 60w, \/wp-content\/uploads\/2025\/12\/Garmin-sensing-setup-screenshot-100x70.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Configure the sync frequency<\/h3>\n\n\n\n<p>Before configuring individual sensors, you can set how often the Garmin probe runs to attempt a sync and fetch data from the watch. This is controlled using the <code>garminalllogs<\/code> sensor in the sensing settings on your dashboard.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"686\" data-id=\"15618\" src=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-1024x686.png\" alt=\"\" class=\"wp-image-15618\" srcset=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-1024x686.png 1024w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-300x201.png 300w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-768x514.png 768w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-50x33.png 50w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-1536x1029.png 1536w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-2048x1371.png 2048w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-60x40.png 60w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.02.24-100x67.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"686\" data-id=\"15617\" src=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-1024x686.png\" alt=\"\" class=\"wp-image-15617\" srcset=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-1024x686.png 1024w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-300x201.png 300w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-768x514.png 768w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-50x33.png 50w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-1536x1029.png 1536w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-2048x1371.png 2048w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-60x40.png 60w, \/wp-content\/uploads\/2025\/12\/Screenshot-2026-05-18-at-16.01.28-100x67.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p>By default the probe runs every <strong>5 minutes<\/strong>. If a sync is still in progress when the next interval is due, the probe will automatically skip that cycle and resume at the following one.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Configure sampling rates<\/h3>\n\n\n\n<p>Each Garmin sensor can be configured with a <strong>sampling interval (seconds)<\/strong> that determines how often entries are logged on the watch. For example, setting the interval to <strong>1<\/strong> for heart rate logs a value every second.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"714\" src=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-1024x714.png\" alt=\"Sampling rate configuration in Garmin sensing setup\" class=\"wp-image-15337\" srcset=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-1024x714.png 1024w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-300x209.png 300w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-768x536.png 768w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-50x35.png 50w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-1536x1072.png 1536w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-2048x1429.png 2048w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-60x42.png 60w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-10.01.56-100x70.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Valid sampling intervals<\/h4>\n\n\n\n<p>Not all measures support configurable sampling. The table below lists valid intervals and limitations.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Measure<\/th><th>Default<\/th><th>Minimum<\/th><th>Maximum<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>BBI (Beat-to-Beat Interval)<\/td><td>N\/A<\/td><td>N\/A<\/td><td>N\/A<\/td><td>No processing interval required; all IBI values recorded by default.<\/td><\/tr><tr><td>Enhanced BBI<\/td><td>N\/A<\/td><td>N\/A<\/td><td>N\/A<\/td><td>No processing interval required; all IBI values recorded by default.<\/td><\/tr><tr><td>Zero Crossing<\/td><td>30s<\/td><td>30s<\/td><td>3600s<\/td><td>Intervals must be multiples of 30 seconds.<\/td><\/tr><tr><td>Steps<\/td><td>60s<\/td><td>60s<\/td><td>60s<\/td><td>Locked at 1 minute.<\/td><\/tr><tr><td>Stress<\/td><td>10s<\/td><td>1s<\/td><td>3600s<\/td><td>Intervals below 10 seconds may not update between recordings (device dependent).<\/td><\/tr><tr><td>Heart Rate<\/td><td>30s<\/td><td>1s<\/td><td>3600s<\/td><td><\/td><\/tr><tr><td>SpO2<\/td><td>30s<\/td><td>1s<\/td><td>3600s<\/td><td>Intervals below 10 seconds may not update between recordings (device dependent).<\/td><\/tr><tr><td>Respiration<\/td><td>10s<\/td><td>1s<\/td><td>3600s<\/td><td>Intervals below 10 seconds may not update between recordings (device dependent).<\/td><\/tr><tr><td>Skin Temperature<\/td><td>\u2014<\/td><td>1s<\/td><td>3600s<\/td><td><\/td><\/tr><tr><td>Wrist Status<\/td><td>\u2014<\/td><td>\u2014<\/td><td>\u2014<\/td><td>Interval field is ignored. Data is generated every 60 seconds and whenever the wrist status changes.<\/td><\/tr><tr><td>Actigraphy 1<\/td><td>30s<\/td><td>1s<\/td><td>3600s<\/td><td>Any integer from 1\u201330s, or any multiple of 30s up to 3600s. Independently configurable from Actigraphy 2 and 3. See below for more details on configuration.<\/td><\/tr><tr><td>Actigraphy 2<\/td><td>30s<\/td><td>1s<\/td><td>3600s<\/td><td>Same valid values as Actigraphy 1. Independently configurable.<\/td><\/tr><tr><td>Actigraphy 3<\/td><td>30s<\/td><td>1s<\/td><td>3600s<\/td><td>Same valid values as Actigraphy 1. Independently configurable.<\/td><\/tr><tr><td>Accelerometer<\/td><td>N\/A<\/td><td>N\/A<\/td><td>N\/A<\/td><td>Raw accelerometer at 25Hz. Not configurable. Very high data rate. Requires frequent sync and can significantly affect battery life.<\/td><\/tr><tr><td>Gyroscope<\/td><td>N\/A<\/td><td>N\/A<\/td><td>N\/A<\/td><td>Raw gyroscope at 32Hz. Not configurable. Very high data rate. Requires frequent sync and can significantly affect battery life.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Extra configuration<\/h3>\n\n\n\n<p>Some measures support additional configuration options beyond the sampling interval. These are set in the sensing setup and affect how data is collected or processed.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Accelerometer<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>allowSleep<\/code><\/td><td>When enabled, accelerometer logging is suspended if the acceleration magnitude does not exceed 100 mG for 30 consecutive seconds. Logging resumes automatically when motion above this threshold is detected.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Actigraphy<\/h4>\n\n\n\n<p>The Direct Garmin integration supports three independent actigraphy streams: <code>ACTIGRAPHY_1<\/code>, <code>ACTIGRAPHY_2<\/code>, and <code>ACTIGRAPHY_3<\/code>. Each is configured separately in the sensing setup with its own thresholds. The <code>instance<\/code> field in the exported data identifies which configuration produced each record.<\/p>\n\n\n\n<p>The following configuration fields are available per actigraphy instance:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>zcThreshold<\/code><\/td><td>Milli-G threshold for zero crossing count. The acceleration magnitude must cross this value for a crossing to be counted in <code>zeroCrossingCount<\/code>.<\/td><\/tr><tr><td><code>tatThreshold<\/code><\/td><td>Milli-G threshold for time-above-threshold. The magnitude must exceed this value to accumulate time in <code>timeAboveThreshold<\/code>.<\/td><\/tr><tr><td><code>energyThreshold<\/code><\/td><td>Milli-G threshold for total energy accumulation. Samples below this value are excluded from <code>totalEnergy<\/code>.<\/td><\/tr><tr><td><code>filterBeforeMagnitude<\/code><\/td><td>When enabled: each axis (X, Y, Z) is filtered independently before the vector magnitude is computed. When disabled: magnitude is computed from raw axes first, then the scalar signal is filtered. Leave unconfigured to use the device default.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Zero Crossing<\/h4>\n\n\n\n<p>The deadband filter controls which zero crossings are counted by requiring the signal to deviate from the average by a minimum amount before a crossing is recorded.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>deadbandValue<\/code><\/td><td>Milli-G threshold the signal must deviate from the average for a zero crossing to be counted. A positive integer in milli-G.<\/td><\/tr><tr><td><code>deadbandEnabled<\/code><\/td><td>Whether the deadband filter is active. When disabled, the <code>deadband<\/code> output field will be <code>0<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Set up Garmin triggers<\/h3>\n\n\n\n<p>You can create triggers based on incoming Garmin data. To configure triggers:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add a <strong>Sensing trigger<\/strong> as an underlying item for the sensing setup. Your setup should look like this:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2025\/06\/Scherm%C2%ADafbeelding-2025-06-19-om-13.53.55.png\" alt=\"Sensing setup with underlying sensing trigger item\" class=\"wp-image-14013\"\/><\/figure>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Select a <strong>Garmin trigger type<\/strong>:<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"220\" src=\"\/wp-content\/uploads\/2025\/12\/image-1-1024x220.png\" alt=\"Choosing a Garmin trigger type\" class=\"wp-image-15338\" srcset=\"\/wp-content\/uploads\/2025\/12\/image-1-1024x220.png 1024w, \/wp-content\/uploads\/2025\/12\/image-1-300x64.png 300w, \/wp-content\/uploads\/2025\/12\/image-1-768x165.png 768w, \/wp-content\/uploads\/2025\/12\/image-1-50x11.png 50w, \/wp-content\/uploads\/2025\/12\/image-1-1536x330.png 1536w, \/wp-content\/uploads\/2025\/12\/image-1-2048x440.png 2048w, \/wp-content\/uploads\/2025\/12\/image-1-60x13.png 60w, \/wp-content\/uploads\/2025\/12\/image-1-100x21.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Define the trigger conditions using computations (see <a href=\"\/knowledge-base\/computation-item-r\/\" target=\"_blank\" rel=\"noreferrer noopener\">Computation item (pseudo R)<\/a>).<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Available extract labels for Garmin data<\/h4>\n\n\n\n<p>When writing trigger computations, you can extract specific data using the <code>extract(newSensorData, 'label')<\/code> function. Below are all available extract labels organized by measurement type:<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Heart Rate<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>heartRates<\/code> &#8211; Vector of heart rate values (BPM)<\/li>\n\n\n\n<li><code>heartRateTimestamps<\/code> &#8211; Vector of timestamps for heart rate measurements<\/li>\n\n\n\n<li><code>heartRateStatuses<\/code> &#8211; Vector of status strings (e.g., &#8220;locked&#8221;, &#8220;unlocked&#8221;)<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Stress<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>stressValues<\/code> &#8211; Vector of stress scores (0-100)<\/li>\n\n\n\n<li><code>stressTimestamps<\/code> &#8211; Vector of timestamps for stress measurements<\/li>\n\n\n\n<li><code>stressStatuses<\/code> &#8211; Vector of status strings<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Steps<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>stepValues<\/code> &#8211; Vector of step counts per interval<\/li>\n\n\n\n<li><code>totalStepsPerEntry<\/code> &#8211; Vector of cumulative steps since midnight<\/li>\n\n\n\n<li><code>stepsStartTimestamps<\/code> &#8211; Vector of interval start timestamps<\/li>\n\n\n\n<li><code>stepsEndTimestamps<\/code> &#8211; Vector of interval end timestamps<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">BBI (Beat-to-Beat Interval)<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>bbiValues<\/code> &#8211; Vector of BBI values in milliseconds<\/li>\n\n\n\n<li><code>bbiTimestamps<\/code> &#8211; Vector of timestamps for BBI measurements<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Enhanced BBI<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>enhancedBbiValues<\/code> &#8211; Vector of enhanced BBI values in milliseconds<\/li>\n\n\n\n<li><code>enhancedBbiGapDurations<\/code> &#8211; Vector of gap durations in milliseconds<\/li>\n\n\n\n<li><code>enhancedBbiTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n\n\n\n<li><code>enhancedBbiStatuses<\/code> &#8211; Vector of status strings<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Respiration<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>respirationRates<\/code> &#8211; Vector of breaths per minute<\/li>\n\n\n\n<li><code>respirationTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n\n\n\n<li><code>respirationStatuses<\/code> &#8211; Vector of status strings<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">SpO2 (Blood Oxygen)<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>spo2Values<\/code> &#8211; Vector of SpO2 percentage readings<\/li>\n\n\n\n<li><code>spo2Timestamps<\/code> &#8211; Vector of timestamps<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Accelerometer<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>accelerometerXValues<\/code> &#8211; Vector of X-axis values in milli-g<\/li>\n\n\n\n<li><code>accelerometerYValues<\/code> &#8211; Vector of Y-axis values in milli-g<\/li>\n\n\n\n<li><code>accelerometerZValues<\/code> &#8211; Vector of Z-axis values in milli-g<\/li>\n\n\n\n<li><code>accelerometerTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Gyroscope<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>gyroscopeXValues<\/code> &#8211; Vector of X-axis values in degrees\/second<\/li>\n\n\n\n<li><code>gyroscopeYValues<\/code> &#8211; Vector of Y-axis values in degrees\/second<\/li>\n\n\n\n<li><code>gyroscopeZValues<\/code> &#8211; Vector of Z-axis values in degrees\/second<\/li>\n\n\n\n<li><code>gyroscopeTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Skin Temperature<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>skinTemperatureValues<\/code> &#8211; Vector of temperature values in \u00b0C<\/li>\n\n\n\n<li><code>skinTemperatureTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n\n\n\n<li><code>skinTemperatureStatuses<\/code> &#8211; Vector of status strings<\/li>\n<\/ul>\n\n\n\n<h5 class=\"wp-block-heading\">Wrist Status<\/h5>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>wristStatuses<\/code> &#8211; Vector of wrist status strings (on-wrist\/off-wrist)<\/li>\n\n\n\n<li><code>wristStatusTimestamps<\/code> &#8211; Vector of timestamps<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Example: Simple heart rate trigger<\/h4>\n\n\n\n<p>Trigger when the average heart rate in the new Garmin data exceeds a threshold:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>doTrigger = 0\n\n# Extract heart rate data\nheartRates = extract(newSensorData, 'heartRates')\n\n# Handle missing data (e.g., watch off-wrist)\nif(is.na(mean(heartRates))){\n    heartRates = 0\n}\n\n# Calculate average and trigger\navgHR = nanmean(heartRates)\n\nif(avgHR &gt; 80){\n    doTrigger = 1\n}<\/code><\/pre>\n\n\n\n<p>Then configure the trigger in the builder:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"652\" src=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-1024x652.png\" alt=\"Trigger configuration in builder\" class=\"wp-image-15340\" srcset=\"\/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-1024x652.png 1024w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-300x191.png 300w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-768x489.png 768w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-50x32.png 50w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-1536x978.png 1536w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-2048x1304.png 2048w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-60x38.png 60w, \/wp-content\/uploads\/2025\/12\/Screenshot-2025-12-11-at-16.48.16-100x64.png 100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>After saving your sensing setup + trigger, it&#8217;s ready to send to participants via an interaction (e.g., as part of an intake questionnaire).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Example: Combine multiple Garmin measures in one trigger<\/h4>\n\n\n\n<p>You can combine measures (e.g., heart rate + stress) to trigger when multiple conditions are met:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>doTrigger = 0\n\n# Extract heart rate\nheartRates = extract(newSensorData, 'heartRates')\n\n# Extract stress\nstressValues = extract(newSensorData, 'stressValues')\n\n# Handle missing data\nif(is.na(mean(heartRates))){\n    heartRates = 0\n}\nif(is.na(mean(stressValues))){\n    stressValues = 0\n}\n\n# Check combined conditions\nif(length(heartRates) &gt; 0 &amp;&amp; length(stressValues) &gt; 0){\n    avgHR = mean(heartRates)\n    avgStress = mean(stressValues)\n\n    # Trigger if BOTH are high\n    if(avgHR &gt; 50 &amp;&amp; avgStress &gt; 30){\n        doTrigger = 1\n    }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Example: Using entry counts for data quality checks<\/h4>\n\n\n\n<p>Check if enough data is available before triggering:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>doTrigger = 0\n\n# Get the count of heart rate measurements\nhrCount = extract(newSensorData, 'heartRateCount')\n\n# Only proceed if we have sufficient data\nif(hrCount &gt; 10){\n    heartRates = extract(newSensorData, 'heartRates')\n    avgHR = mean(heartRates)\n    \n    if(avgHR &gt; 100){\n        doTrigger = 1\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Participant Setup and Pairing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Send the sensing setup to participants<\/h3>\n\n\n\n<p>Once configured, send the sensing setup item to participants through an interaction (this can be part of an intake questionnaire). When participants encounter the sensing setup item, they are guided to pair their Garmin watch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bluetooth pairing process<\/h3>\n\n\n\n<p>The pairing process uses BLE to establish a direct connection between the participant&#8217;s phone and their Garmin watch.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"1024\" src=\"\/wp-content\/uploads\/2025\/12\/IMG_0487-472x1024.png\" alt=\"Pairing screen in m-Path Sense\" class=\"wp-image-15341\" srcset=\"\/wp-content\/uploads\/2025\/12\/IMG_0487-472x1024.png 472w, \/wp-content\/uploads\/2025\/12\/IMG_0487-138x300.png 138w, \/wp-content\/uploads\/2025\/12\/IMG_0487-768x1665.png 768w, \/wp-content\/uploads\/2025\/12\/IMG_0487-23x50.png 23w, \/wp-content\/uploads\/2025\/12\/IMG_0487-709x1536.png 709w, \/wp-content\/uploads\/2025\/12\/IMG_0487-945x2048.png 945w, \/wp-content\/uploads\/2025\/12\/IMG_0487-28x60.png 28w, \/wp-content\/uploads\/2025\/12\/IMG_0487-46x100.png 46w, \/wp-content\/uploads\/2025\/12\/IMG_0487.png 1179w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/figure>\n\n\n\n<p>The m-Path Sense app scans for nearby Garmin devices:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"1024\" src=\"\/wp-content\/uploads\/2025\/12\/IMG_0488-472x1024.png\" alt=\"Scanning for Garmin devices\" class=\"wp-image-15342\" srcset=\"\/wp-content\/uploads\/2025\/12\/IMG_0488-472x1024.png 472w, \/wp-content\/uploads\/2025\/12\/IMG_0488-138x300.png 138w, \/wp-content\/uploads\/2025\/12\/IMG_0488-768x1665.png 768w, \/wp-content\/uploads\/2025\/12\/IMG_0488-23x50.png 23w, \/wp-content\/uploads\/2025\/12\/IMG_0488-709x1536.png 709w, \/wp-content\/uploads\/2025\/12\/IMG_0488-945x2048.png 945w, \/wp-content\/uploads\/2025\/12\/IMG_0488-28x60.png 28w, \/wp-content\/uploads\/2025\/12\/IMG_0488-46x100.png 46w, \/wp-content\/uploads\/2025\/12\/IMG_0488.png 1179w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/figure>\n\n\n\n<p>Participants select their watch from the list of available devices and the app establishes a connection with the watch<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"1024\" src=\"\/wp-content\/uploads\/2025\/12\/IMG_0494-500x1024.jpg\" alt=\"Connected watch confirmation\" class=\"wp-image-15346\" srcset=\"\/wp-content\/uploads\/2025\/12\/IMG_0494-500x1024.jpg 500w, \/wp-content\/uploads\/2025\/12\/IMG_0494-147x300.jpg 147w, \/wp-content\/uploads\/2025\/12\/IMG_0494-768x1572.jpg 768w, \/wp-content\/uploads\/2025\/12\/IMG_0494-24x50.jpg 24w, \/wp-content\/uploads\/2025\/12\/IMG_0494-750x1536.jpg 750w, \/wp-content\/uploads\/2025\/12\/IMG_0494-1001x2048.jpg 1001w, \/wp-content\/uploads\/2025\/12\/IMG_0494-29x60.jpg 29w, \/wp-content\/uploads\/2025\/12\/IMG_0494-49x100.jpg 49w, \/wp-content\/uploads\/2025\/12\/IMG_0494.jpg 1179w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><figcaption class=\"wp-element-caption\">Example: scanning state<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"1024\" src=\"\/wp-content\/uploads\/2025\/12\/IMG_0490-472x1024.png\" alt=\"Wearable device management screen\" class=\"wp-image-15344\" srcset=\"\/wp-content\/uploads\/2025\/12\/IMG_0490-472x1024.png 472w, \/wp-content\/uploads\/2025\/12\/IMG_0490-138x300.png 138w, \/wp-content\/uploads\/2025\/12\/IMG_0490-768x1665.png 768w, \/wp-content\/uploads\/2025\/12\/IMG_0490-23x50.png 23w, \/wp-content\/uploads\/2025\/12\/IMG_0490-709x1536.png 709w, \/wp-content\/uploads\/2025\/12\/IMG_0490-945x2048.png 945w, \/wp-content\/uploads\/2025\/12\/IMG_0490-28x60.png 28w, \/wp-content\/uploads\/2025\/12\/IMG_0490-46x100.png 46w, \/wp-content\/uploads\/2025\/12\/IMG_0490.png 1179w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><figcaption class=\"wp-element-caption\">Example: paired state<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>After pairing, participants can continue the interaction.<\/p>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-warning is-style-alert\"><br><strong>Important:<\/strong> The app needs to be restarted to begin sensing with the correct setup. After the questionnaire finishes, participants will be prompted to restart.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pre-pairing checklist<\/h3>\n\n\n\n<p>BLE pairing can fail for several reasons. Before attempting to pair, ensure that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The Garmin watch is <strong>not connected<\/strong> to another phone or device.<\/li>\n\n\n\n<li>Bluetooth is <strong>enabled<\/strong> on the participant&#8217;s phone.<\/li>\n\n\n\n<li>The watch is in <strong>pairing mode<\/strong>.<\/li>\n\n\n\n<li>If pairing fails, consult the <a href=\"\/knowledge-base\/wearables-garmin-direct-integration\/#troubleshooting-pairing-issues\">pairing issues guide<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Data Collection and Monitoring<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Background sensing<\/h3>\n\n\n\n<p>Once paired successfully, the m-Path Sense app continuously collects data from the Garmin watch in the background. Participants do not need to keep the app open for data collection to occur.<\/p>\n\n\n\n<p>Like other sensors in m-Path Sense, direct Garmin sensing runs continuously until:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The app is killed by the operating system (iOS or Android).<\/li>\n\n\n\n<li>The participant manually closes the app.<\/li>\n\n\n\n<li>Bluetooth connection fails (disabled by the user, watch is dead\/out of range)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Data sync and chunking behavior<\/h3>\n\n\n\n<p>The m-Path Sense app automatically syncs data from the Garmin watch at regular intervals. The probe runs every 5 minutes by default, and can be adjusted using the <a href=\"#configure-the-sync-frequency\">garminalllogs<\/a> sensor in your sensing setup. When syncing data after a large time gap (for example, when the app has been closed for several hours), the system automatically splits the data into 15-minute chunks to ensure reliable processing and upload.<\/p>\n\n\n\n<p>This means that a single sync session may produce multiple measurement entries in your exported data, each covering a 15-minute window. This chunking behavior is automatic and requires no configuration.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Restart reminders<\/h3>\n\n\n\n<p>If the app stops gathering data (for example, if it is killed by the operating system), participants will receive a reminder notification to resume the app. This works the same as other m-Path Sense sensors.<\/p>\n\n\n\n<p>You can configure reminder notifications in the <a href=\"\/knowledge-base\/mobile-sensing-full\/#m-path-sense-settings\">sensing settings<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Exporting and Analyzing Data<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Data export<\/h3>\n\n\n\n<p>Data collected through Direct Garmin integration is exported the same way as other Mobile Sensing data. Data is uploaded from the participant&#8217;s phone to a pCloud or OneDrive location configured in the researcher dashboard (see <a href=\"\/knowledge-base\/adding-a-cloud-storage-location-for-client-file-uploads\/\" target=\"_blank\" rel=\"noreferrer noopener\">Adding a cloud storage location for client file uploads<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Data structure<\/h3>\n\n\n\n<p>Garmin sensing data is exported in <strong>JSON<\/strong> format, similar to other <a href=\"\/knowledge-base\/mobile-sensing-full\/#m-path-sense-data\" target=\"_blank\" rel=\"noreferrer noopener\">m-Path Sense data<\/a>. Each measurement includes a <code><a href=\"https:\/\/manual.m-path.io\/knowledge-base\/mobile-sensing-full\/#time-zone\">sensorStartTime<\/a><\/code> and a <code>data<\/code> object containing metadata (time window, entry counts) and the recorded samples.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"sensorStartTime\": 1765198435067150,\n  \"data\": {\n    \"__type\": \"dk.cachet.carp.garminalllogsdata\",\n    \"fromTime\": \"2025-12-08T13:51:50.101\",\n    \"toTime\": \"2025-12-08T13:53:50.102091\",\n    \"entryCounts\": {\n      \"heartRate\": 118,\n      \"stress\": 2,\n      \"steps\": 2,\n      \"bbi\": 76,\n      \"enhancedBbi\": 150,\n      \"respiration\": 2,\n      \"spo2\": 2,\n      \"accelerometer\": 2150,\n      \"gyroscope\": 0,\n      \"wristStatus\": 0,\n      \"zeroCrossing\": 2,\n      \"skinTemperature\": 0,\n      \"actigraphy1\": 2,\n      \"actigraphy2\": 2,\n      \"actigraphy3\": 2\n    },\n    \"heartRate\": &#91;\n      {\n        \"macAddress\": \"E6:82:85:38:8C:A9\",\n        \"timestamp\": 1765198310000,\n        \"beatsPerMinute\": 73,\n        \"status\": \"locked\"\n      }\n    ]\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-info\"><strong>Note:<\/strong> <code>macAddress<\/code> corresponds to the watch MAC address on Android devices. On iOS, this field contains a UUID instead (Apple does not expose MAC addresses for device identification). All measurement types include the <code>macAddress<\/code> field for device identification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Garmin Measurement Types<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">AccelerometerData<\/h3>\n\n\n\n<p>Captures three-axis acceleration data from the device&#8217;s accelerometer.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp for the accelerometer sample<\/li>\n\n\n\n<li><code>xValue<\/code> (Double): X-axis in milli-g<\/li>\n\n\n\n<li><code>yValue<\/code> (Double): Y-axis in milli-g<\/li>\n\n\n\n<li><code>zValue<\/code> (Double): Z-axis in milli-g<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">ActigraphyData<\/h3>\n\n\n\n<p>Processed activity metrics derived from accelerometer data over a configured interval. There are three independent actigraphy streams (<code>ACTIGRAPHY_1<\/code>, <code>ACTIGRAPHY_2<\/code>, <code>ACTIGRAPHY_3<\/code>), each configured separately in the sensing setup. The <code>instance<\/code> field in each output record identifies which stream produced it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Type<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>macAddress<\/code><\/td><td>String<\/td><td>Device MAC address (Android) or UUID (iOS)<\/td><\/tr><tr><td><code>instance<\/code><\/td><td>String<\/td><td>Identifies which actigraphy stream produced this record. One of <code>\"actigraphy1\"<\/code>, <code>\"actigraphy2\"<\/code>, or <code>\"actigraphy3\"<\/code>.<\/td><\/tr><tr><td><code>startTimestamp<\/code><\/td><td>Date<\/td><td>Start of the processing interval (seconds precision)<\/td><\/tr><tr><td><code>endTimestamp<\/code><\/td><td>Date<\/td><td>End of the processing interval (seconds precision)<\/td><\/tr><tr><td><code>zeroCrossingCount<\/code><\/td><td>Int<\/td><td>Number of times the acceleration magnitude crossed the configured <code>zcThreshold<\/code> during the interval<\/td><\/tr><tr><td><code>timeAboveThreshold<\/code><\/td><td>Double<\/td><td>Seconds the acceleration magnitude was above the configured <code>tatThreshold<\/code> during the interval<\/td><\/tr><tr><td><code>totalEnergy<\/code><\/td><td>Int<\/td><td>Accumulated acceleration magnitude over the interval. Samples below the configured <code>energyThreshold<\/code> are not accumulated. Units: milli-G<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">BBIData<\/h3>\n\n\n\n<p>Beat-to-beat interval (time between consecutive heartbeats).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp<\/li>\n\n\n\n<li><code>bbi<\/code> (Int): Interval in milliseconds<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">EnhancedBBIData<\/h3>\n\n\n\n<p>Enhanced beat-to-beat interval data with status information and gap detection.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp<\/li>\n\n\n\n<li><code>bbi<\/code> (Int): Interval (ms) if valid; otherwise 0<\/li>\n\n\n\n<li><code>gapDuration<\/code> (Int): Gap duration (ms) when there is a gap in the heart rate signal; otherwise 0<\/li>\n\n\n\n<li><code>status<\/code> (String): Status of the entry (e.g., &#8220;valid&#8221;, &#8220;gap&#8221;)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">GyroscopeData<\/h3>\n\n\n\n<p>Captures three-axis rotational data from the gyroscope.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp<\/li>\n\n\n\n<li><code>xValue<\/code> (Double): X-axis in degrees\/second<\/li>\n\n\n\n<li><code>yValue<\/code> (Double): Y-axis in degrees\/second<\/li>\n\n\n\n<li><code>zValue<\/code> (Double): Z-axis in degrees\/second<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">HeartRateData<\/h3>\n\n\n\n<p>Heart rate measurements (beats per minute).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp (seconds precision)<\/li>\n\n\n\n<li><code>beatsPerMinute<\/code> (Int): BPM value<\/li>\n\n\n\n<li><code>status<\/code> (String): Sensor status (e.g., &#8220;locked&#8221;, &#8220;unlocked&#8221;)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">RespirationData<\/h3>\n\n\n\n<p>Breathing rate (breaths per minute).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp (seconds precision)<\/li>\n\n\n\n<li><code>breathsPerMinute<\/code> (Double): BPM value (0.0 if unavailable, check status)<\/li>\n\n\n\n<li><code>status<\/code> (String): Measurement status<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SPO2Data<\/h3>\n\n\n\n<p>Blood oxygen saturation (%).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp (seconds precision)<\/li>\n\n\n\n<li><code>spo2Reading<\/code> (Int): SpO2 percentage<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">SkinTemperatureData<\/h3>\n\n\n\n<p>Skin temperature (\u00b0C).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp (seconds precision)<\/li>\n\n\n\n<li><code>temperature<\/code> (Double): Temperature in \u00b0C (0\u201365\u00b0C, 0.0 if unavailable)<\/li>\n\n\n\n<li><code>status<\/code> (String): Measurement status<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">StepData<\/h3>\n\n\n\n<p>Step counts over time intervals.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>startTimestamp<\/code> (Date): Start timestamp (seconds precision)<\/li>\n\n\n\n<li><code>endTimestamp<\/code> (Date): End timestamp (seconds precision)<\/li>\n\n\n\n<li><code>stepCount<\/code> (Int): Steps in the interval<\/li>\n\n\n\n<li><code>totalSteps<\/code> (Int): Steps since midnight up to <code>endTimestamp<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">StressData<\/h3>\n\n\n\n<p>Stress scores derived from HRV and related metrics.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp (seconds precision)<\/li>\n\n\n\n<li><code>stressScore<\/code> (Int): 0\u2013100 (\u226425 indicates resting, 0 if unavailable)<\/li>\n\n\n\n<li><code>status<\/code> (String): Measurement status<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">WristStatusData<\/h3>\n\n\n\n<p>Indicates whether the watch is currently worn.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>timestamp<\/code> (Date): Timestamp<\/li>\n\n\n\n<li><code>status<\/code> (String): On-wrist \/ off-wrist<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-info\"><strong>Note:<\/strong> Wrist status is generated every minute and whenever the wrist status changes. The sampling interval field is ignored for this measure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ZeroCrossingData<\/h3>\n\n\n\n<p>Activity metrics based on acceleration patterns and energy expenditure.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>macAddress<\/code> (String): Device MAC address (Android) or UUID (iOS)<\/li>\n\n\n\n<li><code>startTimestamp<\/code> (Date): Start timestamp (seconds precision)<\/li>\n\n\n\n<li><code>endTimestamp<\/code> (Date): End timestamp (seconds precision)<\/li>\n\n\n\n<li><code>zeroCrossingCount<\/code> (Int): Number of times the total acceleration magnitude transitions from above to below the average (or vice versa) during the interval. If deadband is active, the signal must also deviate from the average by at least the deadband value for the transition to count.<\/li>\n\n\n\n<li><code>totalEnergy<\/code> (Int): Sum of the RMS deviation of total acceleration from 1G, computed over rolling 8-second windows (updated every 2 seconds) across the configured interval.<\/li>\n\n\n\n<li><code>deadband<\/code> (Int?): The milli-G deviation threshold applied during this interval. Reflects the configured <code>deadbandValue<\/code> when deadband is enabled; <code>0<\/code> when deadband is disabled. See <a href=\"#extra-configuration\">Extra configuration<\/a> for setup details.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting pairing issues<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">Watch not visible during scanning<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm the watch is not already paired with another device.<\/li>\n\n\n\n<li>Toggle Bluetooth off and on on the phone.<\/li>\n\n\n\n<li>If the problem persists, perform a <strong>factory reset<\/strong> on the Garmin watch and try again.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Pairing process fails<\/h4>\n\n\n\n<p>If pairing fails or gets stuck:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Restart the app and try connecting from the <strong>Wearable device management<\/strong> screen.<\/li>\n\n\n\n<li>If it still fails:\n<ul class=\"wp-block-list\">\n<li>Close the m-Path Sense app completely.<\/li>\n\n\n\n<li>Open the phone&#8217;s system Bluetooth settings. If the Garmin device appears as paired, <strong>Forget\/Remove<\/strong> it.<\/li>\n\n\n\n<li>Toggle Bluetooth off and on.<\/li>\n\n\n\n<li>Reopen m-Path Sense and retry pairing from <strong>Wearable device management<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Connection lost after initial pairing<\/h4>\n\n\n\n<p>If a watch was successfully paired but fails to reconnect on a later app start, m-Path Sense will automatically prompt the participant to pair again and show the connection screen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Direct Garmin integration in m-Path enables researchers to collect continuous physiological measurements directly from participants&#8217; Garmin smartwatches. Unlike the standard wearable integration, this feature provides direct communication between the m-Path Sense app and Garmin devices, allowing for higher-resolution data collection and trigger-based interventions. Key Features 1. Setting Up Direct&#8230;<\/p>\n","protected":false},"author":5,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"ht-kb-category":[514,804],"ht-kb-tag":[],"class_list":["post-15292","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-advanced-items","ht_kb_category-cool-stuff"],"_links":{"self":[{"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb\/15292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/comments?post=15292"}],"version-history":[{"count":20,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb\/15292\/revisions"}],"predecessor-version":[{"id":15620,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb\/15292\/revisions\/15620"}],"wp:attachment":[{"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/media?parent=15292"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb-category?post=15292"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/app-manual-wp-001-atfsdabuggg7fzdq.germanywestcentral-01.azurewebsites.net\/wp-json\/wp\/v2\/ht-kb-tag?post=15292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}