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
      706 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.
    • M

      Training Peaks - interval notification

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      18
      1 Votes
      18 Posts
      749 Views
      stromdiddilyS
      @2b2bff said: @stromdiddily there is no universal “This is a workout file, deal with it watch” format. If you are pushing a workout to Garmin, you define the steps. If you push the workout to Suunto, you define a SuuntoPlus Guide. I don’t know how Coros or Apple Watch does handle it. So, Training Peaks - or any other platform for that matter - has to include the respective framework for each brand individually… The other way around, if you read the finished activity from the watch, there is a format that has been widely adopted: Garmin FIT files. I see, this makes sense…thank you
    • Dimitrios KanellopoulosD

      Crash reports collection Q1 2026

      Watching Ignoring Scheduled Pinned Locked Moved Watches
      19
      9 Votes
      19 Posts
      2k Views
      EzioAuditoreE
      @dimitrios-kanellopoulos can this be related to the crashes. https://forum.suunto.com/topic/15193/activities-end-by-itself-when-the-destination-reached-message-appears
    • withManishW

      Offline Map Download Speed

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      11
      0 Votes
      11 Posts
      336 Views
      withManishW
      @maszop sometimes you realise at the moment to download maps and … Yeah, otherwise this is just a discussion.
    • S

      Trash can as POI? Why?

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical 2
      8
      1
      0 Votes
      8 Posts
      326 Views
      EgikaE
      @Sascha-Domres I am with you. And luckily in places where you need orientation (in the wild - not in the cirty), most likely not too many trash cans will populate your screen
    • S

      [Question] No stupid questions - ask anything here

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      144
      4 Votes
      144 Posts
      16k 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
    • L

      Delete a map on the watch

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical 2
      8
      1
      0 Votes
      8 Posts
      294 Views
      L
      @JungleJim @sartoric @2b2bff You’re all right !!! update the maps and got the remove button many thanks
    • B

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

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      6
      0 Votes
      6 Posts
      189 Views
      2
      @matram the HRM DUAL got its last firmware a couple of years ago…
    • OutdoorManO

      Sticky notifications during activities

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      6
      1 Votes
      6 Posts
      303 Views
      J
      I’ve had the same problem since the beginning. Sometimes the notification disappears immediately, sometimes after a long time, and sometimes only manually pressing the crown helps.
    • M

      Canvas rendering limits on the watch — findings and a tiling solution

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      4
      1
      3 Votes
      4 Posts
      295 Views
      M
      @Łukasz-Szmigiel Promise to be brief this time. In LOTS of additional testing we have confirmed an exact limit of drawing line segments in a canvas is 181 line segments if they are chunked in blocks of 20. One more and it always fails silently resulting in a black canvas on a Race S. But we have also found another resource limit that manifest itself in the event log as #3505354 03.06.2026 06:30:14 : WRN WBMAIN : pool id:0 full! (S 120/120) Exactly what the pool is, we are not sure. We speculate that it has to do with communication between FW, app (main.js) and UI (t.html). Symptoms on the watch when this happens is that the watch becomes extremely sluggish, takes several seconds to react to the press of a pause button and the pause / resume screen renders slowly in steps over several seconds. We think the root cause is the simultaneous pressure from drawing in multiple canvases at the same time, we currently have three. The current solution is staggering redraws in different 10Hz ticks and to refresh only when content of the canvas has truly changed. So far it appears to work!
    • gliuk88G

      Elevation gain suddenly inaccurate on flat runs (last 2 weeks)

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      6
      1 Votes
      6 Posts
      448 Views
      Sebastiano CaramuscioS
      @Egika no. Il primo anno e sino a un mese fa era perfetto anche in bici, in estate in inverno e col vento.
    • Stoke80S

      SuuntoPlus for ZoneSense still needed?

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      3
      0 Votes
      3 Posts
      110 Views
      Stoke80S
      @EzioAuditore Thank you for your answer. One Space more for another S+ App
    • ?

      Spent a few hours playing with Suunto Plus

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      6
      1
      15 Votes
      6 Posts
      800 Views
      M
      @Steven-Hambleton These are the font sizes available. There is plenty of options for larger size … f-d-xxxl: data field font, 85px for medium, 155px for large display f-d-xxl: data field font, 65px for medium, 118px for large display f-d-xl: data field font, 57px for medium, 103px for large display f-d-l: data field font, 50px for medium, 91px for large display f-d-m: data field font, 42px for medium, 78px for large display f-d-s: data field font, 35px for medium, 65px for large display f-d-xs: data field font, 25px for medium, 46px for large display However there is not much room for fine tuning at the lower end. I tried rendering text on a canvas and displaying that. It works but takes a bit more effort to program.
    • massimo trinchieriM

      Suunto race 2 e Suunto spark

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      4
      0 Votes
      4 Posts
      149 Views
      Kraisun TuntaK
      @2b2bff I think there may be some confusion between the standard running dynamics already available on the watch and the additional metrics provided by the Suunto Spark. The Race series can already record metrics such as cadence and some running dynamics. However, one of the new metrics provided by the Suunto Spark is Ground Contact Time Balance (left/right balance), which shows how evenly you load your left and right foot while running. As far as I know, this specific metric is currently only supported within the Suunto ecosystem when using the Suunto Run. I have not seen it being recorded or displayed in the activity summary on the Race 2 yet. So if Ground Contact Time Balance is the data you’re looking for, that may be the reason it is missing rather than a connection problem between the Race 2 and the Spark.
    • G

      Measure yourself against a previous activity

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical
      3
      0 Votes
      3 Posts
      82 Views
      G
      [image: 1780592357630-img_9467.png]
    • Dimitrios KanellopoulosD

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

      Watching Ignoring Scheduled Pinned Locked Moved Watches
      272
      4 Votes
      272 Posts
      75k Views
      Derrick SpaffordD
      Snowshoe Running
    • 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
    • M

      Swim temperature stat

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      2
      0 Votes
      2 Posts
      32 Views
      EgikaE
      @mssjk the water temperature. Or maybe I don’t understand your question…
    • MantaM

      Issues RestTimer

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      2
      2
      0 Votes
      2 Posts
      203 Views
      M
      This may not help you directly. But I posted around font positioning and differences in font rendering between watch and simulator here … https://forum.suunto.com/topic/15262/precise-alignment-of-text-and-numbers What you see is probably a result of this effect, where the app author maybe only tested on the simulator (the image you see on the web). There is nothing much you can do apart from pushing the developer. For the future more information about rendering differences between watch and simulator in the documentation would help developers get it right.
    • V

      Sportmodie walking adding Barometer

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical
      2
      0 Votes
      2 Posts
      133 Views
      Łukasz SzmigielŁ
      @vinc14 there is an S+ app with weather trends which you may use. It’ll show you a chart with barometric trend.