Strange difference between devices in Manifest.xml and devices available on Store

I usually release datafields for Edge devices only.

Now I have built a simple datafield - and since it is simple, I decided to release it for Edges and some watches. It is the first time I released a datafield for watches.

The datafield is still "Pending", but I can see that the device list I declared in Manifest XML differs from what will be available on store.

In Manifest.xml there are 58 device IDs declaired but on store there will be available 81 devices.

For example: on store is a D2 Mach1 - I did not declare in Manifest.

Why is there such a difference and is it maybe the reason for not approving the datafield?

  • in the store they count part numbers, while in the manifest you have "device families"

  • If you look in compiler.json for every "Connect IQ device", you will see a list of part numbers associated with the device.

    Roughly speaking, a Connect IQ device (such as fenix7x) refers to a given hardware part, while partNumbers in compiler.json refer to software variants. Note that every CIQ device has a single compiler.json file, which has a single hardwarePartNumber, but 1 or more partNumbers.

    For example, Enduro 2 is grouped under fenix7x - it has its own (software) part number, which aligns with the fact that Enduro 2 is said to just be a Fenix 7X with a bigger battery.

    Note that just because the differences are (mostly) in software, doesn't mean that the software for a given part number can be placed on a different part number (in the same hardware "family"). 

    In the past, the most common reason for multiple software variants for a given device is that one variant was for WW (worldwide) and the other variant was for APAC (Asia-Pacific). This is because the storage on the devices was so limited that it wasn't possible to include fonts for all the languages on a single device variant. So you'd see FR935 (WW) with support for English and European languages/fonts, while FR935 (APAC) would have support for English and Asian languages/fonts.

    These days:

    - many devices only have a single software part number

    - some devices still have multiple part numbers, but each part number is more likely to refer to a "marketing variant" (e.g. Fenix, Quatix, Tactix typically share the same device / hardware part number, but they have different software part numbers)

    - Enduro 2 is basically a Fenix 7X with a big battery (and different case, ofc), and indeed Enduro 2 is a (software) part number on the fenix7x device / hardware part number

    It's too bad Garmin has never felt like explaining any of this to us, so we just have to rediscover it over and over again through the forums and our own self-investigation.

    Especially since:

    - the docs and compiler warning/error messages refer to part numbers, but Garmin never bothered to explain what they are

    - there have been issues surrounding part numbers in the past:

    - re APAC vs WW as mentioned above: since APAC firmware versions have historically lagged behind WW firmware versions (on the real devices), many APAC devs have been hit with the problem where they set their minApiVersion so high that it excludes APAC devices but not WW devices

    - Also re APAC vs WW: a rarer problem occurs if a dev adds explicit support for certain languages, but English is not among them. In this case, it may be the WW devices which are excluded - this would happen if a dev added only languages which are supported by APAC but not WW devices

    - At one point, Garmin removed the Enduro 2 part number from the fenix7x compiler.json device definition. As a result, for 2 months devs were unable to update any Enduro 2 apps on the store. When someone finally reported this, Garmin said "it's ok, the Enduro 2 part number is deprecated and its firmware should've been changed to use the same part number as Fenix 7X". After being bugged by devs, they double-checked and found out it had not been changed, but no problem, the firmware was going to be changed. Finally, after a few more weeks, someone realized that even if the Enduro 2 part number was changed in firmware, it hadn't been changed in the API which determines the list of supported devices for an app in the CIQ store, based on part numbers. i.e. The part number for Fenix 7X still mapped to "Fenix 7X" alone, and not "Fenix 7x / Enduro 2". Finally the CIQ team did a complete 180 and decided to put the Enduro 2 part number back in the device definition (even if it wasn't on the real device), so the store wouldn't break

    Another serious limitation with this scheme is that it's not always possible to look at a device's compiler.json file and tell which of the part numbers correspond to actual devices you can buy.

    e.g. Looking at fenix7x/compiler.json ("displayName": "fēnix 7X / tactix 7 / quatix 7X Solar / Enduro 2"), you could guess that the first part number might be "Fenix 7x", but how can you tell which one is Enduro 2 and which one is Tactix? Do Quatix and Tactix share the same part number? 

    e.g. venu2s has 4 part numbers and the displayName is "Venu 2S", so how would a dev guess what each of the 4 part numbers correspond to? 

    It turns out there is a way to map part numbers to actual device models. As a bonus, you can also use this method determine the Connect IQ store URL to filter apps by each part number. (It isn't obvious for some of the newer devices, like fenix8*, because the device names don't map exactly to the store url - you might be able to guess, but I noticed that everyone who tried failed, and they just assumed store filtering doesn't work for fenix8*)

    - open the CIQ store in a web browser

    - navigate to any app

    - open your dev tools and navigate to the Compatible Devices tab in the app page

    - go to the network tab in dev tools and filter the urls by the string device

    You will see one request: https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/deviceTypes

    Open the response and copy/paste the text to an editor like VS Code. You may wish to beautify/format the text at this point (it's JSON)

    - In this response you will see a list of part numbers and relevant info like "name" (the name that the customer would use), and urlName (the relevant part of the store url)

    e.g.

    {
        "id": "261",
        "partNumber": "006-B4341-00",
        "name": "Enduro 2",
        "additionalNames": [],
        "imageUrl": "https://res.cloudinary.com/it-production/image/upload/v1648824135/Product_Images/en/products/010-02754-00/g/pd-05-sm-66796f25-e282-4a31-bd44-93fb6ddbf2ee.jpg",
        "urlName": "enduro2"
    }

    You will also see what the 4 venu2s variants are:

    Venu 2, Venu 2 (Asia), Mercedes-Benz Venu 2, and Mercedes-Benz Venu 2 (Asia)

    Here's how to use urlName to get the relevant store filter link:

    - obtain known filtering link (you can use garmin express, if it still works, or you can search google for something like "forerunner 935 connect iq")

    Here's the fr935 link: https://apps.garmin.com/en-US/devices/forerunner935/apps 

    Just substitute "forerunner935" (in this example) with urlName for any given part number 

    e.g. urlName for "Fenix 8 Solar (47mm)" is "fenix8s-47mm", so the store url is: [https://apps.garmin.com/en-US/devices/fenix8s-47mm/apps] or [https://apps.garmin.com/devices/fenix8s-47mm/apps]

  • e.g. you can see that the 4 fenix7x part numbers map to:

    {
        "id": "225",
        "partNumber": "006-B3907-00",
        "name": "fēnix® 7X",
        "additionalNames": ["fēnix® 7X - Solar Edition", "fēnix® 7X– Sapphire Solar Edition", "quatix® 7X – Solar Edition"],
        "imageUrl": "https://static.garmincdn.com/en/products/010-02541-11/v/sc-03-sm-cd878574-7789-4323-a2f2-1acebcff5f36.jpg",
        "urlName": "fenix7X"
    }, {
        "id": "226",
        "partNumber": "006-B3910-00",
        "name": "fēnix® 7X",
        "additionalNames": ["fēnix® 7X– Sapphire Dual Power Edition", "quatix® 7X"],
        "imageUrl": "https://static.garmincdn.com/en/products/010-02541-11/v/sc-03-sm-cd878574-7789-4323-a2f2-1acebcff5f36.jpg",
        "urlName": "fenix7X-asia"
    },
    ...
     {
        "id": "258",
        "partNumber": "006-B4135-00",
        "name": "tactix® 7",
        "additionalNames": ["tactix® 7 – Pro Ballistics Edition", "tactix® 7 – Pro Edition"],
        "imageUrl": "https://static.garmincdn.com/en/products/010-02704-00/v/pd-01-sm-b5f086c9-db63-458e-b1c3-70076dff030d.jpg",
        "urlName": "tactix7"
    },
    ...
    {
        "id": "261",
        "partNumber": "006-B4341-00",
        "name": "Enduro 2",
        "additionalNames": [],
        "imageUrl": "https://res.cloudinary.com/it-production/image/upload/v1648824135/Product_Images/en/products/010-02754-00/g/pd-05-sm-66796f25-e282-4a31-bd44-93fb6ddbf2ee.jpg",
        "urlName": "enduro2"
    }

  • Speaking of D2 Mach 1 Pro (not the same as D2 Mach 1 btw), you can use the information I posted to see that:

    - its software part number is "006-B4556-00"

    - the corresponding CIQ device is epix2pro51mm

    in compiler.json:

    - the displayName is "epix Pro (Gen 2) 51mm / D2 Mach 1 Pro / tactix® 7 – AMOLED Edition"

    - the hardwarePartNumber is "010-02804-00"

    So D2 Mach 1 Pro should be very similar to epix Pro (Gen 2) 51mm, from a hardware POV. Maybe it just has a different case and slightly different software.

    Interestingly enough, D2 Mach 1 (non-pro) had a distinct hardware part number / CIQ device. I probably wouldn't read too much into that tho.

  • Wow! Thank you,  , for that interesting and detailed insights!