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
      716 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
      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
    • S

      Trash can as POI? Why?

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical 2
      11
      1
      1 Votes
      11 Posts
      467 Views
      S
      @sky-runner You’re right… ! I see it similarly… it is certainly very difficult not to overload the Maps… POI like water points would certainly be useful on larger zoom levels… But they don’t care about trash cans at all…
    • withManishW

      Offline Map Download Speed

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

      Training Peaks - interval notification

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      18
      1 Votes
      18 Posts
      752 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
    • 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
    • Stoke80S

      SuuntoPlus for ZoneSense still needed?

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      6
      0 Votes
      6 Posts
      192 Views
      M
      @EzioAuditore Do you know if raw RR-data is available from the firmware to allow you to do your own algoritms in a Suunto Plus app? Checked the Developer documentation, but could not see anything there.
    • M

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

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      6
      1
      3 Votes
      6 Posts
      335 Views
      M
      @Łukasz-Szmigiel No I do not think so, there is only a single output in the manifest and three inputs. It seemed more load related as staggering canvas refreshes removed the problem. Worth nothing, on at least one occasion the canvas went black first then as a consequence of the load resulting in handling of that exception (we think) we got the pool full.
    • 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
      226 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
      305 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.
    • P

      Where are the total calories?

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Vertical 2
      3
      1
      0 Votes
      3 Posts
      149 Views
      2
      @Petr-Manek yep It is the same on Android. Although the help talks about total calories as well…
    • ?

      Spent a few hours playing with Suunto Plus

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Plus Development
      6
      1
      15 Votes
      6 Posts
      840 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
      161 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
      96 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
    • 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
      452 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.
    • M

      Race 2 does not automatic counts laps

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race 2
      2
      0 Votes
      2 Posts
      51 Views
      C
      @Masnyband You need to have navigation turned on for LOOP to work… another option is to use my S+ aLOOP which doesn’t require that and is more accurate at detecting your position, preventing false positives.
    • M

      Swim temperature stat

      Watching Ignoring Scheduled Pinned Locked Moved Suunto Race S
      2
      0 Votes
      2 Posts
      67 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
      227 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.