From 64a9c5f2748c4053daa8beb91448cb04d871d560 Mon Sep 17 00:00:00 2001 From: Philip Abbey Date: Sun, 25 Aug 2024 13:07:23 +0100 Subject: [PATCH 1/2] Added null checking to activity stats Position.getInfo().* might return null sometimes, so best check and avoid a numerical error. --- HISTORY.md | 1 + source/BackgroundServiceDelegate.mc | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index f77a024..0e05758 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -30,3 +30,4 @@ | 2.15 | Better support for templates by isolating erroneous returns and marking the menu item. | | 2.16 | Bug fix for lack of phone connection when starting the application. Includes new activity reporting features from [KPWhiver](https://github.com/KPWhiver) covering steps, heart rate, floors climbed and descended, and respiration rate. | | 2.17 | Bug fix for reporting activity metrics that are not found on some devices. | +| 2.18 | Bug fix for reporting activity metrics that might be `null` sometimes. This is unsimulatable situation, so this version is a change based on an informed guess. | diff --git a/source/BackgroundServiceDelegate.mc b/source/BackgroundServiceDelegate.mc index a5d5a51..6726f1e 100644 --- a/source/BackgroundServiceDelegate.mc +++ b/source/BackgroundServiceDelegate.mc @@ -79,13 +79,13 @@ class BackgroundServiceDelegate extends System.ServiceDelegate { private function doUpdate(activity as Lang.Number or Null, sub_activity as Lang.Number or Null) { // System.println("BackgroundServiceDelegate onTemporalEvent(): Making API call."); var position = Position.getInfo(); - // System.println("BackgroundServiceDelegate onTemporalEvent(): gps: " + position.position.toDegrees()); - // System.println("BackgroundServiceDelegate onTemporalEvent(): speed: " + position.speed); - // System.println("BackgroundServiceDelegate onTemporalEvent(): course: " + position.heading + "rad (" + (position.heading * 180 / Math.PI) + "°)"); - // System.println("BackgroundServiceDelegate onTemporalEvent(): altitude: " + position.altitude); - // System.println("BackgroundServiceDelegate onTemporalEvent(): battery: " + System.getSystemStats().battery); - // System.println("BackgroundServiceDelegate onTemporalEvent(): charging: " + System.getSystemStats().charging); - // System.println("BackgroundServiceDelegate onTemporalEvent(): activity: " + Activity.getProfileInfo().name); + // System.println("BackgroundServiceDelegate onTemporalEvent(): GPS : " + position.position.toDegrees()); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Speed : " + position.speed); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Course : " + position.heading + " radians (" + (position.heading * 180 / Math.PI) + "°)"); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Altitude : " + position.altitude); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Battery : " + System.getSystemStats().battery); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Charging : " + System.getSystemStats().charging); + // System.println("BackgroundServiceDelegate onTemporalEvent(): Activity : " + Activity.getProfileInfo().name); // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run @@ -107,11 +107,11 @@ class BackgroundServiceDelegate extends System.ServiceDelegate { { "type" => "update_location", "data" => { - "gps" => position.position.toDegrees(), + "gps" => position.position == null ? [0.0, 0.0] : position.position.toDegrees(), "gps_accuracy" => accuracy, - "speed" => Math.round(position.speed), - "course" => Math.round(position.heading * 180 / Math.PI), - "altitude" => Math.round(position.altitude), + "speed" => Math.round(position.speed == null ? 0 : position.speed), + "course" => Math.round(position.heading == null ? 0 : position.heading * 180 / Math.PI), + "altitude" => Math.round(position.altitude == null ? 0 : position.altitude), } }, { From 01f073e67b5b10e28264bd5cae3dba93a71cf278 Mon Sep 17 00:00:00 2001 From: Philip Abbey Date: Sun, 25 Aug 2024 13:50:29 +0100 Subject: [PATCH 2/2] Update BackgroundServiceDelegate.mc Only submitting non-null values to HA, not fake zeros for null values. --- source/BackgroundServiceDelegate.mc | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/source/BackgroundServiceDelegate.mc b/source/BackgroundServiceDelegate.mc index 6726f1e..c248cde 100644 --- a/source/BackgroundServiceDelegate.mc +++ b/source/BackgroundServiceDelegate.mc @@ -102,17 +102,28 @@ class BackgroundServiceDelegate extends System.ServiceDelegate { accuracy = 10; break; } + + var data = { "gps_accuracy" => accuracy }; + // Only add the non-null fields as all the values are optional in Home Assistant, and it avoid submitting fake values. + if (position.position != null) { + data.put("gps", position.position.toDegrees()); + } + if (position.speed != null) { + data.put("speed", Math.round(position.speed)); + } + if (position.heading != null) { + data.put("course", Math.round(position.heading * 180 / Math.PI)); + } + if (position.altitude != null) { + data.put("altitude", Math.round(position.altitude)); + } + // System.println("BackgroundServiceDelegate onTemporalEvent(): data = " + data.toString()); + Communications.makeWebRequest( (Properties.getValue("api_url") as Lang.String) + "/webhook/" + (Properties.getValue("webhook_id") as Lang.String), { "type" => "update_location", - "data" => { - "gps" => position.position == null ? [0.0, 0.0] : position.position.toDegrees(), - "gps_accuracy" => accuracy, - "speed" => Math.round(position.speed == null ? 0 : position.speed), - "course" => Math.round(position.heading == null ? 0 : position.heading * 180 / Math.PI), - "altitude" => Math.round(position.altitude == null ? 0 : position.altitude), - } + "data" => data, }, { :method => Communications.HTTP_REQUEST_METHOD_POST,