• How to get started!

    Pinned Locked
    1
    15 Votes
    1 Posts
    2k Views
    No one has replied
  • [Guide] How to get deploy working on Linux

    Pinned guide linux suuntoplus development
    5
    18
    5 Votes
    5 Posts
    892 Views
    C
    @SyncBypass Perfect, thank you!
  • [Tip] How to save/load persistent data

    Pinned tip settings variables tutorial json manifest
    8
    2 Votes
    8 Posts
    1k Views
    H
    @SuuntoPartnerTeam Thanks. Exactly what I have expected.
  • 1 Votes
    5 Posts
    1k Views
    S
    @guderaber There is no way to sync images. Also no information to share regarding limitations either, I’m afraid !
  • Examples explained

    Pinned development
    6
    2 Votes
    6 Posts
    1k Views
    SquirrelS
    @Martin-Lillepuu Exactly, and also keep the custom watchfaces (once available) for personal use without going through the bureaucratic hoops of publishing them to official store.
  • [Tip] Helpful CSS for custom layouts

    Pinned tip css development
    1
    0 Votes
    1 Posts
    321 Views
    No one has replied
  • [Inspiration] Share your app ideas

    Pinned inspiration peer-support
    49
    5 Votes
    49 Posts
    6k Views
    T
    @Horizontal_2 I’ve used waypoints that I’ve added on the route for this purpose. This only works if you have the the route so a separate app might be a good idea anyway. I might take a look at this!
  • [Discussion] Share your projects

    Pinned discussion peer-support
    95
    1 Votes
    95 Posts
    11k Views
    M
    I have previously shared my implementation of a structured interval guide. [image: 1781683549257-interval_recover.jpg] As it was not possible to upload FIT files to the watch I decided to implement the setup of a structured interval run on the watch like this. [image: 1781683569172-combined_setup.jpg] Three different interval profiles are stored on the watch. Initial defaults are: 2 x 12 min @ 101% of LT pace 5 x 6 min @ 107% of LT pace 10 x 1 min @ 113% of LT pace The user can change repetitions, interval duration and pace. The new settings will be saved in the profile for the next interval run. Speed zones are retrieved from the watch and used to set LT pace and reasonable pace for warm-up, recovery and cool-down. Recovery duration is set to match interval duration with a lower and upper limit. The watch did not support creating four separate SetUp screens for the UI. So one screen was used in combination with setText for the label and parameter being changed. To avoid problems with rounding effects in Suunto firmware, pace (seconds per kilometer) was used in main.js which was converted to speed (m/s) only when output.
  • 1 Votes
    11 Posts
    1k Views
    M
    One thing that caused my grief when working with subscribed signals (HR, pace) in main.js or in onLoad is that on the simulator signals are always available. On the watch subscribed signals seem to transition from ‘undefined’ -> ‘NaN’ -> a valid number. I ended up needing to protect any use of these signals by using isFinite(), like this. // 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; } Inserting systemEvent() was quite effective in pinpointing the point of failure once I understood how to do it. But I do not really get any error message, just something like this. [MR] messages are inserted by me, so I can see something happened after “G4a”, but not what the actual error was. #3251371 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G1 #3251372 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G2 #3251373 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G3 #3251374 26.05.2026 17:44:39 : EVT UI_FRAMEWORK : JS [MR] G4a1-not-supported #3251375 26.05.2026 17:44:39 : WRN UI_FRAMEWORK : JS I am more of a Swift or C# person used to verbose error messages and traceback. But maybe I have been spoiled.
  • [Question] No stupid questions - ask anything here

    Pinned
    146
    4 Votes
    146 Posts
    16k Views
    R
    I developed the “PumpFoil” app and I have a problem to solve with the GPS. Actualy, in the app, when the speed is up to 10 Km/H, we consider that we are foiling,.but sometimes, the speed rise above 10Km/H while we are stationary. The only way I found to avoid this problem is not to record any start of foiling in the 20 seconds folowing the immertion of the device. I would like to find another way because this one is not usable for SurfFoiling. Is it possible to know when the GPS precision is poor (not enought satellites for example) ? I tried the “/Fusion/Location/Readiness” but it seems that it remains at 100. another idea ?
  • Issues RestTimer

    7
    2
    0 Votes
    7 Posts
    565 Views
    Frédéric FiandinoF
    The app is great. Would it be possible to add an infinite loop feature? For example, I set it to 15 seconds and the watch keeps looping every 15 seconds without having to manually restart it using a button.
  • 4 Votes
    6 Posts
    305 Views
    H
    GPS accuracy may be severely degraded by the rock face blocking the ‘view’ of half of the sky, therefore incline calculation may give random results.
  • Trailing HR / moving average HR - and a question on eliminating HR spikes

    2
    0 Votes
    2 Posts
    134 Views
    M
    @DonTomGot Do not know if this helps. But some suggestions from my side. Heap memory is tight on the watch and effectively unlimited in the simulator. I bumped into this several times. Two fixes I used: Use Uint8Array for HR data - up to 4000 samples seems to be OK Do not declare “scratch” variables in callbacks, make them global Yes, you will need to protect against undefined and null data, but I have only encountered this when starting an exercise. I think the problem you are seeing is probably memory related. Here are some things you could look for in the System Event Log from the watch. Log line Meaning ERR UI_FRAMEWORK : JS:0x...SyntaxError JS syntax error in a template ERR APPLICATION : Zapp:relMemCb (exec:ui) Memory pressure — release requested ERR APPLICATION : Zapp:RelMem→None avail Heap fully exhausted ERR DUKTAPE : JSalloc:16 JS engine can’t allocate — out of memory ERR WBMAIN Background worker error (often follows heap exhaustion) Second topic: when working on my AerobicGuide I was looking for the opposite type of algorithm, preserving spikes. I think the basic idea is to try to establish a slower-moving baseline and then look at rapid deviations from that. You can probably find something in Python that you can play with. Then it becomes a question of picking a simple enough algorithm that it can be implemented on the watch.
  • Python Model using FIT files to model watch analysis and display

    1
    1
    3 Votes
    1 Posts
    129 Views
    No one has replied
  • 5 Votes
    2 Posts
    227 Views
    M
    Must correct myself a bit … MacOS 27 drops support for Intel, i.e. the OS cannot be run on Intel CPUs. It also removes the Rosetta component that provides Intel emulation on top of Apple Silicon during the installation of the new OS. BUT there is a one-year grace period, where you can manually install Rosetta. To my understanding it no longer automatically installs as it did before when needed. You have to do the installation yourself from the command line. But it does work! So now I have the Suunto Plus environment running on two machines, double the productivity And Suunto has one more year to upgrade the simulator!
  • Plus App Custom user settings

    3
    0 Votes
    3 Posts
    230 Views
    Markus HornofM
    I suddenly worked, after a few times uninstall/install the same app build. Seems like there is a problem with stale versions…
  • Debugging and troubleshooting

    2
    0 Votes
    2 Posts
    166 Views
    M
    @DonTomGot I am no JS expert myself. But some tips. The watch runs Duktape JS engine, which is only ES5.1 compliant. The simulator runs QuickJS I think. So code that will work OK in the simulator may silently fail on the watch. There is a pinned thread on the difference between simulator and watch, you can check there for advice on some of the typical stumbling blocks. For instance the missing semicolon on the return statement will work in the simulator but likely fail on the watch. I would also use “View system events” in the “Suunto watch view”. A lot of the failures are silent or not easy to decode, but you may find something. You can also insert your own systemEvent statement to “print” to the event log and get a traceback that way.
  • SuuntoPlus uiView lifecycle — subscription behaviour

    1
    2 Votes
    1 Posts
    138 Views
    No one has replied
  • Precise alignment of text and numbers

    5
    3
    4 Votes
    5 Posts
    436 Views
    Steven HambletonS
    @matram We’re still eagerly awaiting the custom watch face functionality!
  • 3 Votes
    6 Posts
    450 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.

Suunto Terms | Privacy Policy