Suunto app Forum Suunto Community Forum
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login
    1. Home
    2. Popular
    Log in to post
    • All Time
    • Day
    • Week
    • Month
    • All Topics
    • New Topics
    • Watched Topics
    • Unreplied Topics

    • All categories
    • withManishW

      2.53.42 Race S and Pathetic battery life

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      16
      1 Votes
      16 Posts
      548 Views
      E
      @withManish On iOS there is rungap for datamigration. And I use strava and intervals.icu. It collects data from multiple sources (I had different brands in the past). But most importantly, data of 5 or 10 years ago hardly has any relevance. But I’m no hardcore data collector.
    • Dimitrios KanellopoulosD

      Crash reports collection Q1 2026

      Watching Ignoring Scheduled Pinned Locked Moved Watches
      15
      9 Votes
      15 Posts
      1k Views
      stromdiddilyS
      @sky-runner got it, didn’t realize zoom was restricted during a lock
    • Dimitrios KanellopoulosD

      Black grid issue

      Watching Ignoring Scheduled Pinned Locked Moved Watches
      40
      10 Votes
      40 Posts
      6k Views
      S
      @MikeC30 thank you… Unfortunately, the problem has existed since Vertical 1. I was hoping that Suunto had solved this by now. Soft reset as an emergency solution I just did… Thank you
    • S

      [Question] No stupid questions - ask anything here

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      144
      4 Votes
      144 Posts
      15k Views
      M
      @DonTomGot This may be too complex as a first project. But let me start with giving you the overall structure of the code as that seems to be the problem at this point. Manifest.json declares what input you need from the watch firmware, what data you intend to output from main.js to t.html and settings you use in the watch. This is parts of manifest.json "in": [ { "name": "Power", "source": "/Activity/Move/-1/Power/Current", "type": "subscribe" }, { "name": "HeartRate", "source": "/Activity/Move/-1/HeartRate/Current", "type": "subscribe" }, { "name": "Speed", "source": "/Activity/Move/-1/Speed/Current", "type": "subscribe" }, { "name": "SpeedAvg", "source": "/Activity/Lap/-1/Speed/Avg", "type": "subscribe" } ], "out": [ { "name": "PaceTarget" }, { "name": "TimeRemaining" }, { "name": "Debug" } ], "template": [ { "name": "t.html" } ], "settings": [ {"shownName": "Repeat count", "path": "appSettings.repeatCount", "type": "int", "min": 1, "max": 19}, {"shownName": "Target pace for WarmUp (m/s)", "path": "appSettings.targetPaceWarm", "type": "float", "min": 1, "max": 6}, {"shownName": "Target pace for Interval (m/s)", "path": "appSettings.targetPaceInterval", "type": "float", "min": 1, "max": 6}, {"shownName": "Target pace for Recovery (m/s)", "path": "appSettings.targetPaceRecovery", "type": "float", "min": 1, "max": 6}, {"shownName": "Target pace for CoolDown (m/s)", "path": "appSettings.targetPaceCool", "type": "float", "min": 1, "max": 6}, {"shownName": "Duration for WarmUp (s)", "path": "appSettings.durationWarm", "type": "int", "min": 1, "max": 14400}, {"shownName": "Duration for Interval (s)", "path": "appSettings.durationInterval", "type": "int", "min": 1, "max": 14400}, {"shownName": "Duration for Recovery (s)", "path": "appSettings.durationRecovery", "type": "int", "min": 1, "max": 14400}, {"shownName": "Duration for CoolDown (s)", "path": "appSettings.durationCool", "type": "int", "min": 1, "max": 14400} ] The main.js contains declarations for some variables // App settings, see also manifest and data.json var settings; var isPaused; // State machine var currentState = 'WarmUp'; var currentRepition = 1; var repeatCount = 3; var timeRemainingInStep = 10; var currentPaceTarget = 2.326; // Average pace and max HR for last lap var lastLapAvgPace; var lastLapPeakHR; There is also a number methods that deal with the state machine needed for interval training. I give only their declarations and purpose for now. // Function to translate speed to a pace string var speedToPace = function(speed) // Training session State Machine // Get next step, set remaining time // And increment interval counter var setNextState = function() // Function to get target pace for current state var getTargetPace = function() // Function to set text for the top right text block var setTextBlock = function() // Update last lap data, avg pace and peak HR var updateLastLap = function(input, output) The evaluate method may be of interest. Here it comes // System starts calling this about once per second after the sports app is selected // i.e. before the exercise is actually started. // input: contains resources specified in "in" section of the manifest. // output: resources passed to the device (specified in "out" section of the manifest). function evaluate(input, output) { // If we are in an Interval step remember average pace and max HR from this step updateLastLap(input, output) // Count down time remaining in current step if (!isPaused) { timeRemainingInStep -= 1; // Handle the state transition if time remaining is zero if (timeRemainingInStep === 0) { // Trigger a silent lap // $.put('Activity/Trigger', 24); // Set the next state setNextState(); } // End of if time remaining is 0 // Output remaining time to HTML after the new durations is set // If we are done and countdown is negative display positive value output.TimeRemaining = (timeRemainingInStep < 0) ? -timeRemainingInStep : timeRemainingInStep; } // End of if not paused // Get target pace for current step getTargetPace(); // Output target to HTML output.PaceTarget = currentPaceTarget; // Update the top right text block setTextBlock(); } Settings are loaded in onLoad and defaults provided, like this // main.js loaded and system starts calling evaluate() function onLoad(input, output) { // Load app settings settings = localStorage.getObject("appSettings"); // Create default settings if none found if (settings == null) { settings = { targetPaceWarm: 2.326, targetPaceInterval: 2.857, targetPaceRecovery: 2.083, targetPaceCool: 2.083, durationWarm: 10, durationInterval: 12, durationRecovery: 5, durationCool: 20, repeatCount: 2 } } isPaused = true; } The bulk of this code deals with interval training and not the gauges, so if you are only interested in the gauges, you do not need most of the things above. In t.html the code should go inside quotes in the onLoad and onActivate methods, the beginning looks like this. <uiView onActivate = " $.subscribe('/Dev/Time/Tick10hz', function(){ control('#cnv', 'REFRESH'); }) // Subscribe to HR, pace and targets to use in drawing gauges in the canvas $.subscribe('/Activity/Move/-1/HeartRate/Current', function(v) { currentHR = parseFloat(v) * 60; }) $.subscribe('/Activity/Move/-1/Speed/Current', function(v) { currentPace = parseFloat(v); }) $.subscribe('/Zapp/{zapp_index}/Output/PaceTarget', function(v) { paceTarget = parseFloat(v); }) " onLoad=" // Subscribed values var currentHR; var currentPace; var paceTarget; // Target zones var hrZones = [0, 133, 144, 155, 165, 185]; var paceZones = [0, 2.299, 2.5, 2.703, 2.857, 5.556]; // Radius of the display in pixels var radius = 233; // Zone colors (muted, suitable as gauge backgrounds) var z1Color = '#5B8FA8'; // Zone 1 - blue var z2Color = '#6AA87A'; // Zone 2 - green var z3Color = '#C4B050'; // Zone 3 - yellow var z4Color = '#C87D45'; // Zone 4 - orange var z5Color = '#B85555'; // Zone 5 - red var zoneColors = [z1Color, z2Color, z3Color, z4Color, z5Color]; // Other colors var outColor = '#B85555'; // Out of target range (low and high sectors) var inColor = '#6AA87A'; // Target range (mid sector) var inactiveColor = '#999999' // Inactive sector var ptrColor = '#CCCCCC' // Gauge pointer var bkgColor = '#000000' // Black background // For debugging var temp1 = '-'; var temp2 = '-'; // Functions to draw gauges on canvas ---------------------------------- // Draw an arc for a gauge // from from angle in degrees // to to angle in degrees // color arc color // width width of the arc function arcSegment(ctx, from, to, color, width) { ctx.beginPath(); ctx.arc( radius, radius, // center of display radius - 2 - width / 2, // radius - leave a small margin outside arc Math.PI * from / 180, // Angles from - to in degrees converted to radians Math.PI * to / 180 ); ctx.strokeStyle = color; ctx.lineWidth = width; ctx.stroke(); } --- snip --- Apart from the code for rendering the gauge background and pointer which you already have above, you also need methods to identify the current zone to highlight. // Get the index of the the active zone for a 3 zone target gauge // value current value // targetLow low end of target range // targetHigh high end of target range function getActiveTarget(v, targetLow, targetHigh) { if (!isFinite(v)) return 0; if (v > targetHigh) { return 2; } else if (v > targetLow) { return 1; } else { return 0; } } // Get the index of the the active zone for a 5 zone HR gauge // v current value // zones an array of 4-values defining the 5 zones function getActiveZone(v, zones) { if (!isFinite(v)) return 0; for (var i = 1; i < zones.length; i++) { if (v < zones[i]) return i - 1; } return zones.length - 1; } The environment is very challenging to work in, you get very little support. Often the app just silently fails. A few tips. build up in small steps and commit frequently check thoroughly for typos and other mistakes that would be caught by other IDE in the simulator toggle on “developer tools” , that will reveal some mistakes insert systemEvent statements where you can put information in the event log
    • MantaM

      Issues RestTimer

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      1
      2
      0 Votes
      1 Posts
      16 Views
      No one has replied
    • sky-runnerS

      Race S: Extremely high battery use rate

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      66
      5 Votes
      66 Posts
      5k Views
      A
      Hopefully they’re able to fix it soon. It feels like with every update they just introduce more problems. Currently still experiencing the auto-update bug (can’t disable it essentially), and now the battery bug has gotten even worse.
    • D

      Please delete this post

      Watching Ignoring Scheduled Pinned Locked Moved Questions & Feedback
      2
      0 Votes
      2 Posts
      201 Views
      Dimitrios KanellopoulosD
      @DonTomGot its deleted. Also deleting this one
    • Thibault B.T

      [Bug] Maximum SuuntoPlus Apps Reached

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      9
      0 Votes
      9 Posts
      888 Views
      M
      Another data point. I am working on app where I have included 12 minutes of actual HR data in main.js in a Uint8 array. This works nicely on the simulator but it fails on the watch. The app can be loaded but not activated, “too many apps”. If I comment out the test data and reloads the app on the watch, the app can be activated without error. It cannot be a memory constraint issue. I have separately verified that I can create arrays with up to 4000 elements and heap memory may be around 28k on the Race S. Some issue with parsing the declaration?
    • Stefano M64S

      Alarm dismissed without touching the watch (Race)

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race
      10
      2 Votes
      10 Posts
      824 Views
      G
      It happened to me today on a V2 (latest firmware). Alarm went off on time, I looked at my watch. Wrist gesture seems to have dismissed it+allowed the morning report to appear without any touch to the screen.
    • B

      Heart Rate Drops After Starting Activity (Race S + HRM-Dual)

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      3
      0 Votes
      3 Posts
      128 Views
      2
      @bartolomeo6 I have an HRM DUAL and didn’t have any problems with it. Are you sure the belt is connected and used in the activity? The heart symbol with little “wings” on the side? If yes, sync the activity to Runalyze and look at the r-r graph at the bottom. It might give some insights…
    • Dimitrios KanellopoulosD

      What sport mode is missing from our watches in your opinion?

      Watching Ignoring Scheduled Pinned Locked Moved Watches
      270
      4 Votes
      270 Posts
      74k Views
      SuperFlo75S
      Honestly, I have to admit that walking with crutches is definitely something I miss