Compare commits

..
33 Commits
Author SHA1 Message Date
Philip Abbey a543314f0b 365 iq crash on vivoactive 6 ciq 602 unexpected type error failed invoking symbol on menu render (#368)
Catch insecure HTTP usage.
2026-07-28 21:31:10 +01:00
Philip Abbey dcb5c788fb Update HISTORY.md 2026-07-28 21:26:57 +01:00
philipabbey b9d7096d88 Apply automatic changes 2026-07-28 19:42:19 +00:00
Philip Abbey 69ea7df5fc Update strings.xml 2026-07-28 20:31:21 +01:00
Philip Abbey e38301ef1a Added error message when insecure HTTP menu fetch returns SECURE_CONNECTION_REQUIRED 2026-07-28 20:26:25 +01:00
Joseph Abbey e912c96734 Bug fix for PIN enabled items on non-touchscreen devices (#367)
Hopefully a simple change, but care is needed to check the logic. I have
tested on the simulator, but then I did also last time and the logic was
wrong.
2026-07-28 19:53:39 +01:00
Philip Abbey 802388aac8 Big fix for PIN enabled items on non-touchscreen devices 2026-07-28 19:36:26 +01:00
Philip Abbey f042b59932 Update etiquette section with user behavior insights
Clarified user etiquette expectations and addressed public opinions on application complexity.

Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2026-07-21 12:38:44 +01:00
Philip Abbey e0b5c41888 Rename 2026-07-20 opinionated_italian.png to 2026-07-20_GHA_Opinionated_Italian.png
Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2026-07-21 09:36:22 +01:00
Philip Abbey 41d6a8a5c1 Rename opinionated_italian.png to 2026-07-20 opinionated_italian.png
Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2026-07-21 09:35:32 +01:00
Philip Abbey f23216d821 Add files via upload
Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2026-07-21 09:31:05 +01:00
Philip Abbey e1a2ca7c2c 361 prevent pin items for non touch screens (#363)
1. Originally intended bug fix:

<img width="577" height="890" alt="image"
src="https://github.com/user-attachments/assets/f04f720d-01f4-43fb-85ef-2b7e2a11099d"
/>

2. Fixes for the schema regarding numeric `tap_action`.
3. Code fix to initialise numeric pickers when no user defined template
is supplied.
4. Amended version history.
2026-06-24 18:55:22 +01:00
Philip Abbey 02a9472ac1 Update HISTORY.md 2026-06-24 02:10:38 +01:00
Philip Abbey e0b5978406 Update HomeAssistantView.mc
Bug fix for numeric picker initialisation when no user defined template is supplied.
2026-06-24 02:02:18 +01:00
Philip Abbey c48d74138a Update config.schema.json
Numeric's tap_action is different to the tap's, and re-using the $ref caused problems, so properties have been copied.
2026-06-24 01:38:34 +01:00
Philip Abbey 3404c7f679 Update schema for numeric tap_action and HISTORY
Add schema metadata and stricter validation for numeric tap_action: include title & description, disallow additionalProperties on the tap_action and its picker properties to better define the number picker payload. Update HISTORY.md with a 3.14 entry documenting numeric items now supporting tap_action.data and the PIN/menu behavior change, and credit the contributor.
2026-06-24 01:12:20 +01:00
Philip Abbey 8c5bdbc1f8 Non-touch screens cannot use PIN
When a menu item requests a PIN on devices without a touch screen, replace the menu item with an info item displaying a message for the user.
2026-06-24 00:17:26 +01:00
Philip Abbey a97440b997 Preserve tap action data for numeric picker actions (#362)
Numeric menu items currently discard existing `tap_action.data` when
confirming a picker value. This prevents service call options such as
`transition` from being sent with `light.turn_on`.

This change passes `tap_action.data` into numeric menu items and merges
that data with the selected numeric picker value before calling the Home
Assistant service.

Example fixed payload:

```json
{
  "entity_id": "light.living_room",
  "transition": 2,
  "brightness": 128
}

Tested with a Forerunner 965 build and a Home Assistant light brightness numeric picker.
2026-06-23 23:27:45 +01:00
StumblingGamer 17690d4349 Proposing changes to documentation and JSON Schema
Added proposed documentation section explaining Numeric data object and also updated JSON schema to match changes.

I tested the numeric example with tap_action.data in the documented web editor. The current schema did not appear to reject the field,
likely because numeric tap_action does not currently forbid additional properties at that nested level. I still added data explicitly
to the numeric schema so it is documented, discoverable, and type-checked as an object.
2026-06-23 11:12:00 -04:00
StumblingGamer b1fb5d9417 Preserve tap action data for numeric picker actions
Pass tap_action.data into numeric menu items and merge it with the selected picker value before calling the Home Assistant service.
2026-06-22 11:03:23 -04:00
Philip Abbey 2fb59d2a56 Update Actions.md
Main update is to point out the obvious that a PIN can only be used with touch screen enabled devices. Some additional tidying too.
2026-06-18 08:30:53 +01:00
Joseph Abbey 3e3f60c47c Added support for 4 new devices (#360)
Added support for new devices: `d2mach2pro`, `fr170`, `fr170m`, `fr70`.
2026-06-13 12:27:20 +01:00
Philip Abbey 7c4a23866c Added support for 4 new devices 2026-06-13 12:25:57 +01:00
Philip Abbey dbd2b4a568 Amended documentation about special characters in the glance view
And a couple of code tidy items too.
2026-05-15 09:41:44 +01:00
Philip Abbey ed89d1da74 Revise bug report template for clarity
Updated bug report template to clarify issue attribution and wording.

Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2026-04-12 12:56:52 +01:00
Philip Abbey 799288f36f Added new review to Etiquette documentation. 2026-04-02 16:41:50 +01:00
Philip Abbey 2a68fcc95d Send last known location in Background Service (#350)
Changes to location sending and accuracy.
2026-03-16 19:56:39 +00:00
Joseph Abbey b781c054d2 Merge branch 'main' into 348-send-gps-location-with-last-known-quality 2026-03-16 18:33:36 +00:00
Philip Abbey cc32abab28 Amended documentation to cover Glance view crash 2026-03-13 10:34:47 +00:00
Philip Abbey c8953021e3 Commentry and documentation 2026-03-11 18:08:50 +00:00
Philip Abbey 5ddcc14c54 Update BackgroundServiceDelegate.mc
Added comment about reasoning for accuracy.
2026-03-11 14:39:36 +00:00
Philip Abbey 6d0f449904 Update BackgroundServiceDelegate.mc
Amended accuracy for QUALITY_LAST_KNOWN.
2026-03-11 14:34:50 +00:00
Philip Abbey 07f3be0d26 Update BackgroundServiceDelegate.mc
Changes to location sending and accuracy.
2026-03-10 21:55:06 +00:00
59 changed files with 478 additions and 271 deletions
+12 -5
View File
@@ -2,13 +2,19 @@
name: Bug report name: Bug report
about: Create a report to help us improve about: Create a report to help us improve
title: '' title: ''
labels: bug labels: question
assignees: '' assignees: ''
--- ---
**Describe the bug** The majority of bug reports submitted are solved without changes to the Garmin application's code. This means that reporters are too often keen to attribute their issue to a problem with the application instead of:
A clear and concise description of what the bug is. 1. Their own lack of reading documentation
2. Their own infrastructure
Therefore in the first place make your report as if it were a **question** in order to establish if the authors agree there is really a bug!
**Describe your issue**
A clear and concise description of what the issue is.
**IMPORTANT!** **IMPORTANT!**
I have: I have:
@@ -17,8 +23,9 @@ I have:
- [ ] Checked that my JSON Syntax is correct ([options 2, 3, or 4](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file) or otherwise) - [ ] Checked that my JSON Syntax is correct ([options 2, 3, or 4](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file) or otherwise)
- [ ] Checked that my JSON follows the schema ([options 2, 3, or 4](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file)) - [ ] Checked that my JSON follows the schema ([options 2, 3, or 4](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file))
- [ ] Used the online editor to check my JSON against HomeAssistant ([option 1](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file)) - [ ] Used the online editor to check my JSON against HomeAssistant ([option 1](https://github.com/house-of-abbey/GarminHomeAssistant#editing-the-json-file))
- [ ] Checked the [Docs](https://github.com/house-of-abbey/GarminHomeAssistant) - [ ] Read the [Documentation](https://github.com/house-of-abbey/GarminHomeAssistant)
- [ ] Checked the [Troubleshooting Guide](https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/TroubleShooting.md) - [ ] Run through the [Troubleshooting Guide](https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/TroubleShooting.md)
- [ ] Checked the [Known Issues](https://github.com/house-of-abbey/GarminHomeAssistant?tab=readme-ov-file#known-issues), i.e. the problems beyond the control of this Garmin application and must therefore be tolerated!
**To Reproduce** **To Reproduce**
Steps to reproduce the behavior: Steps to reproduce the behavior:
+5 -3
View File
@@ -33,11 +33,13 @@ From version 2.6 the application includes reporting your location. The location
You get whatever your device provides at the moment, i.e. at the accuracy the device currently provides. If your watch is not calibrated you get poor data. It might mean that you get more accurate location data when you are in a location tracking activity (i.e. not swimming pool lengths). The device [indicates an accuracy](https://developer.garmin.com/connect-iq/api-docs/Toybox/Position.html#Quality-module) in units of: You get whatever your device provides at the moment, i.e. at the accuracy the device currently provides. If your watch is not calibrated you get poor data. It might mean that you get more accurate location data when you are in a location tracking activity (i.e. not swimming pool lengths). The device [indicates an accuracy](https://developer.garmin.com/connect-iq/api-docs/Toybox/Position.html#Quality-module) in units of:
- `Position.QUALITY_NOT_AVAILABLE` - No update provided - `Position.QUALITY_NOT_AVAILABLE` - No update provided
- `Position.QUALITY_LAST_KNOWN` - No update provided - `Position.QUALITY_LAST_KNOWN` - We translate that to 200 m arbitrarily
- `Position.QUALITY_POOR` - We translate that to 500 m arbitrarily - `Position.QUALITY_POOR` - We translate that to 100 m arbitrarily
- `Position.QUALITY_USABLE` - We translate that to 100 m arbitrarily - `Position.QUALITY_USABLE` - We translate that to 50 m arbitrarily
- `Position.QUALITY_GOOD` - We translate that to 10 m arbitrarily - `Position.QUALITY_GOOD` - We translate that to 10 m arbitrarily
NB. These values have been revised as of Ver 3.12.
**You cannot rely on the radius of the circle of accuracy in any resulting maps as any meaningful indication of error.** **You cannot rely on the radius of the circle of accuracy in any resulting maps as any meaningful indication of error.**
## Activity Reporting ## Activity Reporting
+183 -162
View File
@@ -18,7 +18,7 @@ A user has reported a maximum of 26 items with Ver 3.5. This measurement has sho
As a worked example, for Ver 3.6 working on an `instinct2x` device: As a worked example, for Ver 3.6 working on an `instinct2x` device:
| Feature | Memory (bytes) | Cost (bytes) | | Feature | Memory (bytes) | Cost (bytes) |
|--------------------------------------|---------------:|-------------:| |:-------------------------------------|---------------:|-------------:|
| Declared available to application | 98,304 | | | Declared available to application | 98,304 | |
| Measured available to application | 94,112 | (4,192 less) | | Measured available to application | 94,112 | (4,192 less) |
| Application used | 65,696 | | | Application used | 65,696 | |
@@ -28,167 +28,188 @@ As a worked example, for Ver 3.6 working on an `instinct2x` device:
Our test menu presently contains a mix of 28 items, consisting of nested group, toggle, tap, info and numeric items with templates. So each item requires (12,624 + 14,856) / 28 = 982 bytes. Our test menu presently contains a mix of 28 items, consisting of nested group, toggle, tap, info and numeric items with templates. So each item requires (12,624 + 14,856) / 28 = 982 bytes.
## Glance Memory Usage
Using a `venu2` device the Glance view memory statistics are:
| Measure | Memory (bytes) |
|:----------|----------------:|
| Total | 61,344 |
| Peak Used | 32,224 |
| Free | 29,120 |
This means that for older devices listed below, with only 32 kB of Glance memory, the Glance view crashes with an "_Out Of Memory Error_". There is no opportunity in the code to intervene and no way to catch this fatal error. Nor is there any way to disable the Glance view on a device by device basis. Therefore, the only answer at present is to allow the Glance view to crash. It may display "HomeAssistant" as the Glance view text before crashing.
This problem has been explored via a [Github issue](https://github.com/house-of-abbey/GarminHomeAssistant/issues/347). This is now listed as a [known issue](./README.md#known-issues).
## Garmin Devices ## Garmin Devices
The following table details all the devices as at 1 October 2025 and whether they are supported by Garmin HomeAssistant. The available application memory is also detailed so that it can be compared to an application version listed above. Of particular concern are the 'Instinct' range of devices, being the smallest we currently support. New feature requests are now being vetted against how they might affect our ability to support the 'Instinct' range of devices. At some point support may have to be withdrawn in order to allow the Garmin HomeAssistant application to grow further. The following table details all the devices as at March 2026 and whether they are supported by Garmin HomeAssistant. The available application and glance memory is also detailed so that it can be compared to an application version listed above. Of particular concern are the 'Instinct' range of devices, being the smallest we currently support. New feature requests are now being vetted against how they might affect our ability to support the 'Instinct' range of devices. At some point support may have to be withdrawn in order to allow the Garmin HomeAssistant application to grow further.
| Device | Supported | Application Memory | | Device | Supported | Application Memory | Glance Memory |
|----------------------------|:---------:|--------------------:| |:---------------------------|:---------:|-------------------:|---------------:|
| d2bravo | N | 65,536 | | approachs50 | Y | 786,432 | 65,536 |
| d2bravo_titanium | N | 65,536 | | approachs60 | N | 131,072 | |
| fenix3 | N | 65,536 | | approachs62 | N | 1,048,576 | |
| fenix3_hr | N | 65,536 | | approachs7042mm | Y | 786,432 | 65,536 |
| fr230 | N | 65,536 | | approachs7047mm | Y | 786,432 | 65,536 |
| fr235 | N | 65,536 | | d2air | Y | 1,048,576 | |
| fr630 | N | 65,536 | | d2airx10 | Y | 786,432 | 65,536 |
| fr920xt | N | 65,536 | | d2bravo | N | 65,536 | |
| vivoactive | N | 65,536 | | d2bravo_titanium | N | 65,536 | |
| descentg1 | Y | 98,304 | | d2charlie | N | 1,310,720 | |
| instinct2 | Y | 98,304 | | d2delta | Y | 1,310,720 | |
| instinct2s | Y | 98,304 | | d2deltapx | Y | 1,310,720 | |
| instinct2x | Y | 98,304 | | d2deltas | Y | 1,310,720 | |
| instinctcrossover | Y | 98,304 | | d2mach1 | Y | 786,432 | 65,536 |
| approachs60 | N | 131,072 | | d2mach2 | Y | 786,432 | 65,536 |
| enduro | Y | 131,072 | | descentg1 | Y | 98,304 | 32,768 |
| fenix5 | Y | 131,072 | | descentg2 | Y | 786,432 | 65,536 |
| fenix5s | Y | 131,072 | | descentmk1 | N | 1,310,720 | |
| fenix6 | Y | 131,072 | | descentmk2 | Y | 1,310,720 | 32,768 |
| fenix6s | Y | 131,072 | | descentmk2s | Y | 1,310,720 | 32,768 |
| fenixchronos | Y | 131,072 | | descentmk343mm | Y | 786,432 | 65,536 |
| fr245 | Y | 131,072 | | descentmk351mm | Y | 786,432 | 65,536 |
| fr55 | Y | 131,072 | | edge1030 | Y | 1,048,576 | |
| fr645 | Y | 131,072 | | edge1030bontrager | Y | 1,048,576 | |
| fr735xt | N | 131,072 | | edge1030plus | Y | 1,048,576 | |
| fr935 | Y | 131,072 | | edge1040 | Y | 1,048,576 | 65,536 |
| instinct3solar45mm | Y | 131,072 | | edge1050 | Y | 1,048,576 | 65,536 |
| instincte40mm | Y | 131,072 | | edge130 | N | | |
| instincte45mm | Y | 131,072 | | edge130plus | N | | |
| venusq | Y | 131,072 | | edge520plus | Y | 1,048,576 | |
| vivoactive3 | Y | 131,072 | | edge530 | Y | 1,048,576 | |
| vivoactive3d | N | 131,072 | | edge540 | Y | 1,048,576 | 65,536 |
| vivoactive_hr | N | 131,072 | | edge550 | Y | 1,048,576 | 65,536 |
| edge_520 | N | 262,144 | | edge820 | Y | 1,048,576 | |
| fr255 | Y | 524,288 | | edge830 | Y | 1,048,576 | |
| fr255s | Y | 524,288 | | edge840 | Y | 1,048,576 | 65,536 |
| approachs50 | Y | 786,432 | | edge850 | Y | 1,048,576 | 65,536 |
| approachs7042mm | Y | 786,432 | | edgeexplore | Y | 1,048,576 | |
| approachs7047mm | Y | 786,432 | | edgeexplore2 | Y | 1,048,576 | 65,536 |
| d2airx10 | Y | 786,432 | | edgemtb | Y | 1,048,576 | 65,536 |
| d2mach1 | Y | 786,432 | | edge_1000 | N | 1,048,576 | |
| descentg2 | Y | 786,432 | | edge_520 | N | 262,144 | |
| descentmk343mm | Y | 786,432 | | enduro | Y | 131,072 | 32,768 |
| descentmk351mm | Y | 786,432 | | enduro3 | Y | 786,432 | 65,536 |
| enduro3 | Y | 786,432 | | epix | N | 1,048,576 | |
| epix2 | Y | 786,432 | | epix2 | Y | 786,432 | 65,536 |
| epix2pro42mm | Y | 786,432 | | epix2pro42mm | Y | 786,432 | 65,536 |
| epix2pro47mm | Y | 786,432 | | epix2pro47mm | Y | 786,432 | 65,536 |
| epix2pro47mmsystem7preview | Y | 786,432 | | epix2pro47mmsystem7preview | Y | 786,432 | 65,536 |
| epix2pro51mm | Y | 786,432 | | epix2pro51mm | Y | 786,432 | 65,536 |
| fenix7 | Y | 786,432 | | etrextouch | Y | 2,359,296 | |
| fenix7pro | Y | 786,432 | | fenix3 | N | 65,536 | |
| fenix7pronowifi | Y | 786,432 | | fenix3_hr | N | 65,536 | |
| fenix7s | Y | 786,432 | | fenix5 | Y | 131,072 | |
| fenix7spro | Y | 786,432 | | fenix5plus | Y | 1,310,720 | |
| fenix7x | Y | 786,432 | | fenix5s | Y | 131,072 | |
| fenix7xpro | Y | 786,432 | | fenix5splus | Y | 1,310,720 | |
| fenix7xpronowifi | Y | 786,432 | | fenix5x | Y | 1,310,720 | |
| fenix843mm | Y | 786,432 | | fenix5xplus | Y | 1,310,720 | |
| fenix847mm | Y | 786,432 | | fenix6 | Y | 131,072 | 32,768 |
| fenix8pro47mm | Y | 786,432 | | fenix6pro | Y | 1,310,720 | 32,768 |
| fenix8solar47mm | Y | 786,432 | | fenix6s | Y | 131,072 | 32,768 |
| fenix8solar51mm | Y | 786,432 | | fenix6spro | Y | 1,310,720 | 32,768 |
| fenixe | Y | 786,432 | | fenix6xpro | Y | 1,310,720 | 32,768 |
| fr165 | Y | 786,432 | | fenix7 | Y | 786,432 | 65,536 |
| fr165m | Y | 786,432 | | fenix7pro | Y | 786,432 | 65,536 |
| fr255m | Y | 786,432 | | fenix7pronowifi | Y | 786,432 | 65,536 |
| fr255sm | Y | 786,432 | | fenix7s | Y | 786,432 | 65,536 |
| fr265 | Y | 786,432 | | fenix7spro | Y | 786,432 | 65,536 |
| fr265s | Y | 786,432 | | fenix7x | Y | 786,432 | 65,536 |
| fr57042mm | Y | 786,432 | | fenix7xpro | Y | 786,432 | 65,536 |
| fr57047mm | Y | 786,432 | | fenix7xpronowifi | Y | 786,432 | 65,536 |
| fr955 | Y | 786,432 | | fenix843mm | Y | 786,432 | 65,536 |
| fr965 | Y | 786,432 | | fenix847mm | Y | 786,432 | 65,536 |
| fr970 | Y | 786,432 | | fenix8pro47mm | Y | 786,432 | 65,536 |
| instinct3amoled45mm | Y | 786,432 | | fenix8solar47mm | Y | 786,432 | 65,536 |
| instinct3amoled50mm | Y | 786,432 | | fenix8solar51mm | Y | 786,432 | 65,536 |
| instinctcrossoveramoled | Y | 786,432 | | fenixchronos | Y | 131,072 | |
| marq2 | Y | 786,432 | | fenixe | Y | 786,432 | 65,536 |
| marq2aviator | Y | 786,432 | | fr165 | Y | 786,432 | 65,536 |
| system8preview | N | 786,432 | | fr165m | Y | 786,432 | 65,536 |
| venu2 | Y | 786,432 | | fr230 | N | 65,536 | |
| venu2plus | Y | 786,432 | | fr235 | N | 65,536 | |
| venu2s | Y | 786,432 | | fr245 | Y | 131,072 | 32,768 |
| venu3 | Y | 786,432 | | fr245m | Y | 1,310,720 | 32,768 |
| venu3s | Y | 786,432 | | fr255 | Y | 524,288 | 65,536 |
| venu441mm | Y | 786,432 | | fr255m | Y | 786,432 | 65,536 |
| venu445mm | Y | 786,432 | | fr255s | Y | 524,288 | 65,536 |
| venusq2 | Y | 786,432 | | fr255sm | Y | 786,432 | 65,536 |
| venusq2m | Y | 786,432 | | fr265 | Y | 786,432 | 65,536 |
| venux1 | Y | 786,432 | | fr265s | Y | 786,432 | 65,536 |
| vivoactive5 | Y | 786,432 | | fr45 | N | | |
| vivoactive6 | Y | 786,432 | | fr55 | Y | 131,072 | 32,768 |
| approachs62 | N | 1,048,576 | | fr57042mm | Y | 786,432 | 65,536 |
| d2air | Y | 1,048,576 | | fr57047mm | Y | 786,432 | 65,536 |
| edge1030 | Y | 1,048,576 | | fr630 | N | 65,536 | |
| edge1030bontrager | Y | 1,048,576 | | fr645 | Y | 131,072 | |
| edge1030plus | Y | 1,048,576 | | fr645m | Y | 1,048,576 | |
| edge1040 | Y | 1,048,576 | | fr735xt | N | 131,072 | |
| edge1050 | Y | 1,048,576 | | fr745 | Y | 1,310,720 | 32,768 |
| edge520plus | Y | 1,048,576 | | fr920xt | N | 65,536 | |
| edge530 | Y | 1,048,576 | | fr935 | Y | 131,072 | |
| edge540 | Y | 1,048,576 | | fr945 | Y | 1,310,720 | 32,768 |
| edge550 | Y | 1,048,576 | | fr945lte | Y | 1,310,720 | 32,768 |
| edge820 | Y | 1,048,576 | | fr955 | Y | 786,432 | 65,536 |
| edge830 | Y | 1,048,576 | | fr965 | Y | 786,432 | 65,536 |
| edge840 | Y | 1,048,576 | | fr970 | Y | 786,432 | 65,536 |
| edge850 | Y | 1,048,576 | | garminswim2 | N | | |
| edgeexplore | Y | 1,048,576 | | gpsmap66 | Y | 2,359,296 | |
| edgeexplore2 | Y | 1,048,576 | | gpsmap67 | Y | 2,359,296 | |
| edgemtb | Y | 1,048,576 | | gpsmap86 | N | 2,359,296 | |
| edge_1000 | N | 1,048,576 | | gpsmaph1 | Y | 2,359,296 | |
| epix | N | 1,048,576 | | instinct2 | Y | 98,304 | 32,768 |
| fr645m | Y | 1,048,576 | | instinct2s | Y | 98,304 | 32,768 |
| legacyherocaptainmarvel | Y | 1,048,576 | | instinct2x | Y | 98,304 | 32,768 |
| legacyherofirstavenger | Y | 1,048,576 | | instinct3amoled45mm | Y | 786,432 | 65,536 |
| legacysagadarthvader | Y | 1,048,576 | | instinct3amoled50mm | Y | 786,432 | 65,536 |
| legacysagarey | Y | 1,048,576 | | instinct3solar45mm | Y | 131,072 | 32,768 |
| venu | Y | 1,048,576 | | instinctcrossover | Y | 98,304 | 32,768 |
| venud | Y | 1,048,576 | | instinctcrossoveramoled | Y | 786,432 | 65,536 |
| venusqm | Y | 1,048,576 | | instincte40mm | Y | 131,072 | 32,768 |
| vivoactive3m | Y | 1,048,576 | | instincte45mm | Y | 131,072 | 32,768 |
| vivoactive3mlte | Y | 1,048,576 | | legacyherocaptainmarvel | Y | 1,048,576 | |
| vivoactive4 | Y | 1,048,576 | | legacyherofirstavenger | Y | 1,048,576 | |
| vivoactive4s | Y | 1,048,576 | | legacysagadarthvader | Y | 1,048,576 | |
| d2charlie | N | 1,310,720 | | legacysagarey | Y | 1,048,576 | |
| d2delta | Y | 1,310,720 | | marq2 | Y | 786,432 | 65,536 |
| d2deltapx | Y | 1,310,720 | | marq2aviator | Y | 786,432 | 65,536 |
| d2deltas | Y | 1,310,720 | | marqadventurer | Y | 1,310,720 | 32,768 |
| descentmk1 | N | 1,310,720 | | marqathlete | Y | 1,310,720 | 32,768 |
| descentmk2 | Y | 1,310,720 | | marqaviator | Y | 1,310,720 | 32,768 |
| descentmk2s | Y | 1,310,720 | | marqcaptain | Y | 1,310,720 | 32,768 |
| fenix5plus | Y | 1,310,720 | | marqcommander | Y | 1,310,720 | 32,768 |
| fenix5splus | Y | 1,310,720 | | marqdriver | Y | 1,310,720 | 32,768 |
| fenix5x | Y | 1,310,720 | | marqexpedition | Y | 1,310,720 | 32,768 |
| fenix5xplus | Y | 1,310,720 | | marqgolfer | Y | 1,310,720 | 32,768 |
| fenix6pro | Y | 1,310,720 | | montana7xx | Y | 2,359,296 | |
| fenix6spro | Y | 1,310,720 | | oregon7xx | N | 2,359,296 | |
| fenix6xpro | Y | 1,310,720 | | rino7xx | N | 2,359,296 | |
| fr245m | Y | 1,310,720 | | system8preview | N | 786,432 | 65,536 |
| fr745 | Y | 1,310,720 | | venu | Y | 1,048,576 | |
| fr945 | Y | 1,310,720 | | venu2 | Y | 786,432 | 65,536 |
| fr945lte | Y | 1,310,720 | | venu2plus | Y | 786,432 | 65,536 |
| marqadventurer | Y | 1,310,720 | | venu2s | Y | 786,432 | 65,536 |
| marqathlete | Y | 1,310,720 | | venu3 | Y | 786,432 | 65,536 |
| marqaviator | Y | 1,310,720 | | venu3s | Y | 786,432 | 65,536 |
| marqcaptain | Y | 1,310,720 | | venu441mm | Y | 786,432 | 65,536 |
| marqcommander | Y | 1,310,720 | | venu445mm | Y | 786,432 | 65,536 |
| marqdriver | Y | 1,310,720 | | venud | Y | 1,048,576 | |
| marqexpedition | Y | 1,310,720 | | venusq | Y | 131,072 | |
| marqgolfer | Y | 1,310,720 | | venusq2 | Y | 786,432 | 65,536 |
| gpsmap66 | Y | 2,359,296 | | venusq2m | Y | 786,432 | 65,536 |
| gpsmap67 | Y | 2,359,296 | | venusqm | Y | 1,048,576 | |
| gpsmap86 | N | 2,359,296 | | venux1 | Y | 786,432 | 65,536 |
| gpsmaph1 | Y | 2,359,296 | | vivoactive | N | 65,536 | |
| montana7xx | Y | 2,359,296 | | vivoactive3 | Y | 131,072 | |
| oregon7xx | N | 2,359,296 | | vivoactive3d | N | 131,072 | |
| rino7xx | N | 2,359,296 | | vivoactive3m | Y | 1,048,576 | |
| vivoactive3mlte | Y | 1,048,576 | |
| vivoactive4 | Y | 1,048,576 | |
| vivoactive4s | Y | 1,048,576 | |
| vivoactive5 | Y | 786,432 | 65,536 |
| vivoactive6 | Y | 786,432 | 65,536 |
| vivoactive_hr | N | 131,072 | |
| vivolife | N | | |
+24 -3
View File
@@ -18,7 +18,7 @@
# Etiquette # Etiquette
Thank you to all those who have provided positive feedback, code and language translations, you have made the product better. The majority of users that contact us are grateful and we thank you for your courtesy. Sadly not everyone is as reasonable or polite. What follows is what the authors consider reasonable behaviour from users. We are getting a sufficient number of examples that it feels like something has to be called out! There are some users who feel "entitled" to be discourteous, as evidences by some of the Garmin application reviews. Thank you to all those who have provided positive feedback, code and language translations, you have made the product better. The majority of users that contact us are grateful and we thank you for your courtesy. Sadly not everyone is as reasonable or polite. What follows is what the authors consider reasonable behaviour from users. We are getting a sufficient number of examples that it feels like something has to be called out! There are some users who feel "entitled" to be discourteous, as evidences by some of the Garmin application reviews. Its too easy to express an uninformed opinion publicaly these days without being held accountable and having to defend it as reasonable.
> [!IMPORTANT] > [!IMPORTANT]
> **The intended audience for this application are those comfortable with configuring a HomeAssistant** (e.g. editing the YAML configuration files) and debugging why URLs don't work. It does not require programming skills, but the menu is configured via JSON which feels like "coding" (more like "describing"). If you are not comfortable with this relatively low level of configuration, you may like to try other Garmin applications instead. > **The intended audience for this application are those comfortable with configuring a HomeAssistant** (e.g. editing the YAML configuration files) and debugging why URLs don't work. It does not require programming skills, but the menu is configured via JSON which feels like "coding" (more like "describing"). If you are not comfortable with this relatively low level of configuration, you may like to try other Garmin applications instead.
@@ -142,6 +142,8 @@ On Mon, 6 May 2024 at 09:01, <noreply@garmin.com> wrote:
![Please help me set this up](images/etiquette/2024-05-06_GHA_Bad_Review.png) ![Please help me set this up](images/etiquette/2024-05-06_GHA_Bad_Review.png)
<img src="images/etiquette/2026-04-02_GHA_Bad_Review.png" width="70%" title="Not working">
Answer: Make sure you meet the [minimum requirements for being a user](#etiquette) please! Provide more information on what the problem actually is. Clearly the support reply pointing to the documentation was either not read or not considered helpful, hence the point about meeting the minimum user requirements. Answer: Make sure you meet the [minimum requirements for being a user](#etiquette) please! Provide more information on what the problem actually is. Clearly the support reply pointing to the documentation was either not read or not considered helpful, hence the point about meeting the minimum user requirements.
On Fri, 31 Oct 2025 at 11:45, <noreply@garmin.com> wrote: On Fri, 31 Oct 2025 at 11:45, <noreply@garmin.com> wrote:
@@ -198,6 +200,25 @@ Answer: Make sure you meet the [minimum requirements for being a user](#etiquett
(This last email trail does beg the question how this user ever expected to be able to work with their own Home Assistant server...) (This last email trail does beg the question how this user ever expected to be able to work with their own Home Assistant server...)
**This one is interesting for a different reason.**
<img src="images/etiquette/2026-07-20_GHA_Opinionated_Italian.png" width="70%" title="Complicated for hobbyist">
> "I reverse malware for a living"
- Putting yourself on a pedestal?
- Are we supposed to credit you that you opinion carries additional weight?
> "this is complicated for a hobbyist"
Not for himself, but speaking on behalf of other users, how noble? Except the app is rated 4.7 in the store presently, so plenty of other users, including 'hobbyists', seem to disagree.
- Why did you feel you had to post an opinion on behalf of _any_ other users?
- Are hobbyists not as clever as you?
You're free to voice your opinion, but if you do it publicly, I have the freedom to reply and point out the flaws in your argument.
Do you not have a clue about writing significant applications in constrained space (i.e. including older devices), and therefore the limits that imposes on the application, e.g. menu building?
--- ---
### API Keys ### API Keys
@@ -390,10 +411,10 @@ Don't get an embarrassing retort, I call out those who "click & complain" withou
Two words. Perhaps too lazy to consider why others gave rave reviews and ponder what he was doing wrong? Perhaps did not consider there might be some documentation to assist or support routes (subject to [getting a polite reply](getting-help-with-a-polite-reply))? Two words. Perhaps too lazy to consider why others gave rave reviews and ponder what he was doing wrong? Perhaps did not consider there might be some documentation to assist or support routes (subject to [getting a polite reply](getting-help-with-a-polite-reply))?
<img src="images/etiquette/2026-01-21 GHA_Bad_Review.png" width="70%" title="Two words"> <img src="images/etiquette/2026-01-21_GHA_Bad_Review.png" width="70%" title="Two words">
--- ---
Blaming the wrong application. Just rude. Please get your facts straight. And it was such a simple workaround for the Garmin Connect IQ app bug. Blaming the wrong application. Just rude. Please get your facts straight. And it was such a simple workaround for the Garmin Connect IQ app bug.
<img src="images/etiquette/2025-11-19%20GHA_Bad_Review.png" width="85%" title="Misplaced blame"> <img src="images/etiquette/2025-11-19_GHA_Bad_Review.png" width="85%" title="Misplaced blame">
+6 -2
View File
@@ -36,7 +36,7 @@
| 2.21 | Added 7 new devices (`edge1050`, `enduro3`, `fenix843mm`, `fenix847mm`, `fenix8solar47mm`, `fenix8solar51mm`, `fenixe`) and upgraded the SDK to 7.3.0. Fix for a bug on Edge devices introduced by v2.16 activity reporting improvements. | | 2.21 | Added 7 new devices (`edge1050`, `enduro3`, `fenix843mm`, `fenix847mm`, `fenix8solar47mm`, `fenix8solar51mm`, `fenixe`) and upgraded the SDK to 7.3.0. Fix for a bug on Edge devices introduced by v2.16 activity reporting improvements. |
| 2.22 | <img src="images/pin_view.png" width="200" title="PIN Entry View"/><br/>Major feature release adding an optional PIN to menu items. This significant new feature has been provided by [@moesterheld](https://github.com/moesterheld). Please do not rely on this application for security. Use at your own risk! | | 2.22 | <img src="images/pin_view.png" width="200" title="PIN Entry View"/><br/>Major feature release adding an optional PIN to menu items. This significant new feature has been provided by [@moesterheld](https://github.com/moesterheld). Please do not rely on this application for security. Use at your own risk! |
| 2.23 | Added "info" menu item for displaying information via a template without a tap or toggle. Essentially like the old 'template' type that was deprecated when all items were amended to display evaluated templates. That action removed the display only items too hastily. Added 5 new devices in the model range Instinct 3 and Instinct E. | | 2.23 | Added "info" menu item for displaying information via a template without a tap or toggle. Essentially like the old 'template' type that was deprecated when all items were amended to display evaluated templates. That action removed the display only items too hastily. Added 5 new devices in the model range Instinct 3 and Instinct E. |
| 2.24 | Experiment to prevent new Webhook IDs being created unnecessarily. Reduced the latency for the first menu update. Added 4 new devices: approachs50, descentg2, descentmk1, and gpsmap66. | | 2.24 | Experiment to prevent new Webhook IDs being created unnecessarily. Reduced the latency for the first menu update. Added 4 new devices: `approachs50`, `descentg2`, ~~`descentmk1`~~ (subsequently withdrawn in v3.6), and `gpsmap66`. |
| 2.25 | 2 Bug fixes. First time startup issues caused by v2.24 change and a fix for pure numbers in returned templates. | | 2.25 | 2 Bug fixes. First time startup issues caused by v2.24 change and a fix for pure numbers in returned templates. |
| 2.26 | Retry responsive menu fix failed in v2.24. Cosmetic internal class changes. | | 2.26 | Retry responsive menu fix failed in v2.24. Cosmetic internal class changes. |
| 2.27 | Trivial bug fix for the glance view to prevent the "Unconfigured" result being erroneously displayed because the settings were not yet pulled from persistent storage. | | 2.27 | Trivial bug fix for the glance view to prevent the "Unconfigured" result being erroneously displayed because the settings were not yet pulled from persistent storage. |
@@ -51,9 +51,13 @@
| 3.3 | Providing automatic detection for menu definition updates, but still requires an application restart. | | 3.3 | Providing automatic detection for menu definition updates, but still requires an application restart. |
| 3.4 | Fixed a bug where templates failed to display in toggle menu items (at least on some devices). Fixed a bug where a menu item requesting to exit on completion appeared to indicate failure when using Wi-Fi or LTE. The fix uses a delay in exiting the application modelled as sufficient for a Venu 2 device, so this might need tweaking for other devices. Attempt to fixed an "Out of Memory" bug caused by v3.3 by making automatic checking for menu updates both optional and automatically turned off when insufficient memory is available. This last bug is device dependent and may require another attempt. Internationalisation improvements with thanks to [@krzys_h](https://github.com/krzys-h) for a new automated translations script. | | 3.4 | Fixed a bug where templates failed to display in toggle menu items (at least on some devices). Fixed a bug where a menu item requesting to exit on completion appeared to indicate failure when using Wi-Fi or LTE. The fix uses a delay in exiting the application modelled as sufficient for a Venu 2 device, so this might need tweaking for other devices. Attempt to fixed an "Out of Memory" bug caused by v3.3 by making automatic checking for menu updates both optional and automatically turned off when insufficient memory is available. This last bug is device dependent and may require another attempt. Internationalisation improvements with thanks to [@krzys_h](https://github.com/krzys-h) for a new automated translations script. |
| 3.5 | Added support for Edge 550, 850 & MTB, Fenix 8 Pro 47mm, GPSMAP H1, Instinct Crossover AMOLED, Venu 4 41mm & 45mm, & Venu X1 devices which also required an SDK update to 8.3.0. The simulation of the Edge 850 device was off, as it failed to update the display and text was the wrong colour, but the buttons menu items operated HA correctly. The assumption is the simulation model is buggy until someone [reports](https://github.com/house-of-abbey/GarminHomeAssistant/issues) otherwise. | | 3.5 | Added support for Edge 550, 850 & MTB, Fenix 8 Pro 47mm, GPSMAP H1, Instinct Crossover AMOLED, Venu 4 41mm & 45mm, & Venu X1 devices which also required an SDK update to 8.3.0. The simulation of the Edge 850 device was off, as it failed to update the display and text was the wrong colour, but the buttons menu items operated HA correctly. The assumption is the simulation model is buggy until someone [reports](https://github.com/house-of-abbey/GarminHomeAssistant/issues) otherwise. |
| 3.6 | Added `numeric` menu item type thanks to [@thmichel](https://github.com/thmichel). This allows you to select a numeric value to set for an entity. Confirmations can now display a user supplied message. [Schema update](README.md#old-deprecated-formats) to keep pace with HomeAssistant and correct a previous decision. Schema changes for consistency. | | 3.6 | Added `numeric` menu item type thanks to [@thmichel](https://github.com/thmichel). This allows you to select a numeric value to set for an entity. Confirmations can now display a user supplied message. [Schema update](README.md#old-deprecated-formats) to keep pace with HomeAssistant and correct a previous decision. Schema changes for consistency. `descentmk1` device removed as the simulation does not read the settings and therefore we cannot support the device. |
| 3.7 | Bug fix for `numeric` menu items not working over Wi-Fi & LTE. | | 3.7 | Bug fix for `numeric` menu items not working over Wi-Fi & LTE. |
| 3.8 | Added icon for `numeric` menu items and revised icons in general. | | 3.8 | Added icon for `numeric` menu items and revised icons in general. |
| 3.9 | Small update to warn users with empty menu definitions to read the instructions! | | 3.9 | Small update to warn users with empty menu definitions to read the instructions! |
| 3.10 | Bug avoidance for a fatal _"Error: Out Of Memory Error"_ in the glance when caching the menu to [`Storage`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Application/Storage.html). This is now delayed until the main application is opened. Added support for two new devices, D2 Mach 2 and eTrex Touch. | | 3.10 | Bug avoidance for a fatal _"Error: Out Of Memory Error"_ in the glance when caching the menu to [`Storage`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Application/Storage.html). This is now delayed until the main application is opened. Added support for two new devices, D2 Mach 2 and eTrex Touch. |
| 3.11 | <img src="images/Venu2_glance_default.png" width="200" title="Default Glance"/><br/>Better handling of menus larger than the Glance view can handle. As a result the Glance can no longer verify the availability of the JSON menu as fetching it might cause an _"Error: Out Of Memory Error"_. Provide two user supplied HTTP Headers. Bug fix for the numeric picker. | | 3.11 | <img src="images/Venu2_glance_default.png" width="200" title="Default Glance"/><br/>Better handling of menus larger than the Glance view can handle. As a result the Glance can no longer verify the availability of the JSON menu as fetching it might cause an _"Error: Out Of Memory Error"_. Provide two user supplied HTTP Headers. Bug fix for the numeric picker. |
| 3.12 | Amended GPS accuracy values used by the background service. |
| 3.13 | Added support for new devices: `d2mach2pro`, `fr170`, `fr170m`, `fr70`. |
| 3.14 | Numeric items now support `tap_action.data` fields so service call options like `transition` are catered for. See the documentation on [Additional Action Data](https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/examples/Numeric.md#additional-action-data). This features has been provided by [@StumblingGamer](https://github.com/StumblingGamer). Now prevent PIN enabled menu items from being enabled on non-touch screen devices. The PIN must be removed for the menu item to function. Fix for initialising numeric pickers with no user defined template. |
| 3.15 | The prevention of PIN enabled menu items on non-touch screen devices was improperly implemented, this version provides a bug fix. Added an error message to catch _insecure HTTP_ usage. |
+1 -1
View File
@@ -467,7 +467,7 @@ Check the latest unresolved [issues](https://github.com/house-of-abbey/GarminHom
10. There are memory limits, particularly for older devices. Please see the [explanation of the memory limits](Devices.md) and device support. 10. There are memory limits, particularly for older devices. Please see the [explanation of the memory limits](Devices.md) and device support.
11. There is a 32 kB memory limit for any Glance views that mean too large a menu definition can cause the Glance view to crash. The symptom is that a previously 'Available' menu (green text) now appears as 'Unavailable' (red text) because the HTTP request to both retrieve the menu and convert it to `Dictionary` objects (from which the glance view can extract the `glance` field) ran out of memory. Out of memory exceptions are fatal and cannot be caught in order to code around them. Therefore the Glance status does not get updated to 'Available' as you would expect. The solution is to limit the size of your JSON menu definition by experimentation. For the same reason, the Glance view can no longer cache the menu to `Storage` ahead of the main application as the keys in that storage are limited to 8 kB. Remember its an app running on your watch not a desktop! 11. There is a 32 kB memory limit for Glance views on some devices that mean the code and data for the Glance view is too large to load and the Glance view crashes before any code can intervene to prevent the fatal "Out Of Memory Error". Nor is it possible to disable the Glance view in the [application manifest](./manifest.xml) on a per device basis. The simple advice is, for older watches affected, do not try to use the Glance view. To see if your device is affected, please trawl the [devices page](./Devices.md).
# Authors & Contributors # Authors & Contributors
+21 -4
View File
@@ -251,11 +251,17 @@
"$ref": "#/$defs/content" "$ref": "#/$defs/content"
}, },
"tap_action": { "tap_action": {
"$ref": "#/$defs/tap_action", "title": "Tap Action",
"description": "Numeric tap action definition to include the number picker. 'confirm', 'pin' and 'exit' fields are optional.",
"properties": { "properties": {
"action": { "action": {
"$ref": "#/$defs/action" "$ref": "#/$defs/action"
}, },
"data": {
"type": "object",
"title": "Additional action data",
"description": "Fixed Home Assistant service data. The selected picker value is merged into this object using the picker's data_attribute. Service-specific fields cannot be schema checked here."
},
"picker": { "picker": {
"type": "object", "type": "object",
"title": "Number picker configuration", "title": "Number picker configuration",
@@ -289,13 +295,24 @@
"max", "max",
"step", "step",
"data_attribute" "data_attribute"
] ],
"additionalProperties": false
},
"confirm": {
"$ref": "#/$defs/confirm"
},
"pin": {
"$ref": "#/$defs/pin"
},
"exit": {
"$ref": "#/$defs/exit"
} }
}, },
"required": [ "required": [
"action", "action",
"picker" "picker"
] ],
"additionalProperties": false
}, },
"enabled": { "enabled": {
"$ref": "#/$defs/enabled" "$ref": "#/$defs/enabled"
@@ -982,7 +999,7 @@
"tap_action": { "tap_action": {
"type": "object", "type": "object",
"title": "Tap Action", "title": "Tap Action",
"description": "'confirm' and 'pin' fields are optional.", "description": "'confirm', 'pin' and 'exit' fields are optional.",
"properties": { "properties": {
"confirm": { "confirm": {
"$ref": "#/$defs/confirm" "$ref": "#/$defs/confirm"
+11 -2
View File
@@ -25,6 +25,8 @@ Two simple examples using a scene and a cover as `tap` menu items.
} }
``` ```
## Confirmation
Any menu item with an action (`tap`, `template`, or `toggle`), may have a confirmation view added. For consistency this is always done via the `tap_action` JSON object, even though for a `toggle` menu item there will only ever be a single field inside. For the `toggle` menu item, the confirmation is presented on both `on` and `off` directions. There is no option for asymmetry, i.e. only in one direction. Any menu item with an action (`tap`, `template`, or `toggle`), may have a confirmation view added. For consistency this is always done via the `tap_action` JSON object, even though for a `toggle` menu item there will only ever be a single field inside. For the `toggle` menu item, the confirmation is presented on both `on` and `off` directions. There is no option for asymmetry, i.e. only in one direction.
```json ```json
@@ -56,6 +58,8 @@ The `confirm` field may contain a string instead of a Boolean in order to provid
} }
``` ```
## Personal Identification Number (PIN)
**The authors do not advise the use of this application for security sensitive devices. But we suspect users are taking that risk anyway, hence a PIN confirmation is provided that can be used for additional menu item security.** **The authors do not advise the use of this application for security sensitive devices. But we suspect users are taking that risk anyway, hence a PIN confirmation is provided that can be used for additional menu item security.**
This can be enabled by setting the `pin` field in the `tap_action`. The `pin` field overrides `confirm`. Explicitly setting `confirm` is not necessary. This can be enabled by setting the `pin` field in the `tap_action`. The `pin` field overrides `confirm`. Explicitly setting `confirm` is not necessary.
@@ -70,9 +74,14 @@ The 4-digit PIN is set globally for all actions in the app settings in Connect I
When entering an invalid PIN for the fifth time within 2 minutes, the PIN dialog will be locked for all actions for the next 10 minutes. Entering a valid PIN will always reset the failure counter. When entering an invalid PIN for the fifth time within 2 minutes, the PIN dialog will be locked for all actions for the next 10 minutes. Entering a valid PIN will always reset the failure counter.
<img src="../images/pin_view.png" width="200" title="Confirmation View"/> <img src="../images/pin_view.png" width="200" title="PIN View"/>
Note that for notify events, you _must_ not supply an `entity_id` or the API call will fail. There are other examples too. > [!IMPORTANT]
> The PIN entry requires a touch screen enabled device.
## Additional Data
Some `action`s require additional `data` to be supplied. The following example shows how we handle this scenario. Note that for notify events, you _must not_ supply an `entity_id` or the API call will fail. There are other examples too.
```json ```json
{ {
+1 -1
View File
@@ -48,7 +48,7 @@ The 'status' view will persist showing until the API becomes available as withou
You may make this as complicated as you like! But you have limited space and only ASCII text characters. **It is essential to turn on menu caching in order to display of the template**. This is a change in v3.11 where multiple users are now making larger JSON menus than was originally envisaged for this watch application. As a result the Glance view would fail with an untrapable (fatal) _"Error: Out Of Memory Error"_. A work around is to pull out the glance subsection of the menu and cache that separately during execution of the full application, but that means any changes to the customised Glance view do not show until after the full application has been run. You may make this as complicated as you like! But you have limited space and only ASCII text characters. **It is essential to turn on menu caching in order to display of the template**. This is a change in v3.11 where multiple users are now making larger JSON menus than was originally envisaged for this watch application. As a result the Glance view would fail with an untrapable (fatal) _"Error: Out Of Memory Error"_. A work around is to pull out the glance subsection of the menu and cache that separately during execution of the full application, but that means any changes to the customised Glance view do not show until after the full application has been run.
> [!IMPORTANT] > [!IMPORTANT]
> Sadly what you cannot do is use special characters like: 🌞🔋⛅🪫. Whilst these do display in menu items, they do not seem to work on the Glance view. We really like them, so have tried but failed. Only ASCII text appears to be supported by the Garmin Connect IQ SDK's Glance View. This is not something we have any control over, please do not request this to be "fixed". > Sadly support for special characters like 🌞🔋⛅🪫 in the glance view is device dependent. For example they are not available on a Venu2 device but are available on a Venu X1 device. The application documentation shows them displaying in menu items. Only ASCII text appears to be universally supported by the Garmin Connect IQ (as you might hope). This is not something we have any control over, please do not request this to be "fixed".
It is possible to revert to the default glance content without deleting the template by changing the `type` to `status`. It is possible to revert to the default glance content without deleting the template by changing the `type` to `status`.
+30
View File
@@ -39,6 +39,36 @@ Field | Purpose
It may well be the case that often `attribute` and `data_attribute` are the same attribute, as with this example. It may well be the case that often `attribute` and `data_attribute` are the same attribute, as with this example.
## Additional Action Data
The `tap_action` object may also include a `data` object for fixed service call parameters. When the picker value is selected, the application merges the picker value into this `data` object using `data_attribute`.
For example, a light brightness picker can request a HomeAssistant transition while still using the picker value for `brightness`.
```json
{
"name": "Lounge Brightness",
"content": "{{ ((state_attr('light.lounge','brightness') | int(0) / 255) * 100) | round(0) }}%",
"type": "numeric",
"entity": "light.lounge",
"tap_action": {
"action": "light.turn_on",
"data": {
"transition": 2
},
"picker": {
"step": 5,
"min": 0,
"max": 255,
"attribute": "brightness",
"data_attribute": "brightness"
}
}
}
```
The resulting action data sent to HomeAssistant contains both the fixed `transition` value and the selected `brightness` value.
## Helper ## Helper
You might define a "helper" entity as follows in HomeAssistant: You might define a "helper" entity as follows in HomeAssistant:

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

+4
View File
@@ -43,6 +43,7 @@
<iq:product id="d2deltas"/> <iq:product id="d2deltas"/>
<iq:product id="d2mach1"/> <iq:product id="d2mach1"/>
<iq:product id="d2mach2"/> <iq:product id="d2mach2"/>
<iq:product id="d2mach2pro"/>
<iq:product id="descentg1"/> <iq:product id="descentg1"/>
<iq:product id="descentg2"/> <iq:product id="descentg2"/>
<iq:product id="descentmk2"/> <iq:product id="descentmk2"/>
@@ -101,6 +102,8 @@
<iq:product id="fenixe"/> <iq:product id="fenixe"/>
<iq:product id="fr165"/> <iq:product id="fr165"/>
<iq:product id="fr165m"/> <iq:product id="fr165m"/>
<iq:product id="fr170"/>
<iq:product id="fr170m"/>
<iq:product id="fr245"/> <iq:product id="fr245"/>
<iq:product id="fr245m"/> <iq:product id="fr245m"/>
<iq:product id="fr255"/> <iq:product id="fr255"/>
@@ -114,6 +117,7 @@
<iq:product id="fr57047mm"/> <iq:product id="fr57047mm"/>
<iq:product id="fr645"/> <iq:product id="fr645"/>
<iq:product id="fr645m"/> <iq:product id="fr645m"/>
<iq:product id="fr70"/>
<iq:product id="fr745"/> <iq:product id="fr745"/>
<iq:product id="fr935"/> <iq:product id="fr935"/>
<iq:product id="fr945"/> <iq:product id="fr945"/>
+7 -2
View File
@@ -52,12 +52,13 @@ d2deltas.resourcePath = $(d2deltas.resourcePath);resources-launcher-40-40;resour
d2mach1.resourcePath = $(d2mach1.resourcePath);resources-launcher-60-60;resources-icons-48 d2mach1.resourcePath = $(d2mach1.resourcePath);resources-launcher-60-60;resources-icons-48
# Screen Size 454x454 launcher icon size 65x65 # Screen Size 454x454 launcher icon size 65x65
d2mach2.resourcePath = $(d2mach2.resourcePath);resources-launcher-65-65;resources-icons-53 d2mach2.resourcePath = $(d2mach2.resourcePath);resources-launcher-65-65;resources-icons-53
d2mach2pro.resourcePath = $(d2mach2pro.resourcePath);resources-launcher-65-65;resources-icons-53
# Screen Size 176x176 launcher icon size 62x62 # Screen Size 176x176 launcher icon size 62x62
descentg1.resourcePath = $(descentg1.resourcePath);resources-launcher-62-62;resources-icons-21 descentg1.resourcePath = $(descentg1.resourcePath);resources-launcher-62-62;resources-icons-21
# Screen Size 390x390 launcher icon size 60x60 # Screen Size 390x390 launcher icon size 60x60
descentg2.resourcePath = $(descentg2.resourcePath);resources-launcher-60-60;resources-icons-46 descentg2.resourcePath = $(descentg2.resourcePath);resources-launcher-60-60;resources-icons-46
# Screen Size 240x240 launcher icon size 40x40 # Screen Size 240x240 launcher icon size 40x40 - Does not work in simulation
descentmk1.resourcePath = $(descentmk1.resourcePath);resources-launcher-40-40;resources-icons-28 #descentmk1.resourcePath = $(descentmk1.resourcePath);resources-launcher-40-40;resources-icons-28
# Screen Size 280x280 launcher icon size 40x40 # Screen Size 280x280 launcher icon size 40x40
descentmk2.resourcePath = $(descentmk2.resourcePath);resources-launcher-40-40;resources-icons-32 descentmk2.resourcePath = $(descentmk2.resourcePath);resources-launcher-40-40;resources-icons-32
# Screen Size 240x240 launcher icon size 40x40 # Screen Size 240x240 launcher icon size 40x40
@@ -150,6 +151,8 @@ fenixe.resourcePath = $(fenixe.resourcePath);resources-launcher-60-60;resources-
# Screen Size 390x390 launcher icon size 54x54 # Screen Size 390x390 launcher icon size 54x54
fr165.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46 fr165.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46
fr165m.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46 fr165m.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46
fr170.resourcePath = $(fr170.resourcePath);resources-launcher-54-54;resources-icons-46
fr170m.resourcePath = $(fr170m.resourcePath);resources-launcher-54-54;resources-icons-46
# Screen Size 240x240 launcher icon size 40x40 # Screen Size 240x240 launcher icon size 40x40
fr245.resourcePath = $(fr245.resourcePath);resources-launcher-40-40;resources-icons-28 fr245.resourcePath = $(fr245.resourcePath);resources-launcher-40-40;resources-icons-28
fr245m.resourcePath = $(fr245m.resourcePath);resources-launcher-40-40;resources-icons-28 fr245m.resourcePath = $(fr245m.resourcePath);resources-launcher-40-40;resources-icons-28
@@ -171,6 +174,8 @@ fr57047mm.resourcePath = $(fr57047mm.resourcePath);resources-launcher-65-65;reso
# Screen Size 240x240 launcher icon size 40x40 # Screen Size 240x240 launcher icon size 40x40
fr645.resourcePath = $(fr645.resourcePath);resources-launcher-40-40;resources-icons-28 fr645.resourcePath = $(fr645.resourcePath);resources-launcher-40-40;resources-icons-28
fr645m.resourcePath = $(fr645m.resourcePath);resources-launcher-40-40;resources-icons-28 fr645m.resourcePath = $(fr645m.resourcePath);resources-launcher-40-40;resources-icons-28
# Screen Size 390x390 launcher icon size 54x54
fr70.resourcePath = $(fr70.resourcePath);resources-launcher-54-54;resources-icons-46
# Screen Size 240x240 launcher icon size 40x40 # Screen Size 240x240 launcher icon size 40x40
fr745.resourcePath = $(fr745.resourcePath);resources-launcher-40-40;resources-icons-28 fr745.resourcePath = $(fr745.resourcePath);resources-launcher-40-40;resources-icons-28
fr935.resourcePath = $(fr935.resourcePath);resources-launcher-40-40;resources-icons-28 fr935.resourcePath = $(fr935.resourcePath);resources-launcher-40-40;resources-icons-28
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Arabic Generated by Google Translate and gemini-2.5-flash from English to Arabic
تم الإنشاء بواسطة ترجمة Google و gemini-2.5-flash من الإنجليزية إلى العربية تم الإنشاء بواسطة ترجمة Google وgemini-2.5-flash من الإنجليزية إلى العربية
--> -->
<strings> <strings>
@@ -38,6 +38,7 @@
<string id="NoAPIKey" scope="glance">لا يوجد مفتاح API في إعدادات التطبيق.</string> <string id="NoAPIKey" scope="glance">لا يوجد مفتاح API في إعدادات التطبيق.</string>
<string id="NoApiUrl" scope="glance">لا يوجد عنوان URL لـ API في إعدادات التطبيق.</string> <string id="NoApiUrl" scope="glance">لا يوجد عنوان URL لـ API في إعدادات التطبيق.</string>
<string id="NoConfigUrl" scope="glance">لا يوجد عنوان URL للتكوين في إعدادات التطبيق.</string> <string id="NoConfigUrl" scope="glance">لا يوجد عنوان URL للتكوين في إعدادات التطبيق.</string>
<string id="NoHTTPS">لا توجد استجابة، استخدم اتصال HTTPS آمنًا.</string>
<string id="NoInternet">لا يوجد اتصال بالإنترنت.</string> <string id="NoInternet">لا يوجد اتصال بالإنترنت.</string>
<string id="NoJson">لم يتم إرجاع أي JSON من طلب HTTP.</string> <string id="NoJson">لم يتم إرجاع أي JSON من طلب HTTP.</string>
<string id="NoMenu">خطأ في تعريف القائمة، تحقق من التعليمات.</string> <string id="NoMenu">خطأ في تعريف القائمة، تحقق من التعليمات.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Няма ключ за API в настройките на приложението.</string> <string id="NoAPIKey" scope="glance">Няма ключ за API в настройките на приложението.</string>
<string id="NoApiUrl" scope="glance">Няма URL адрес на API в настройките на приложението.</string> <string id="NoApiUrl" scope="glance">Няма URL адрес на API в настройките на приложението.</string>
<string id="NoConfigUrl" scope="glance">Няма URL адрес за конфигурация в настройките на приложението.</string> <string id="NoConfigUrl" scope="glance">Няма URL адрес за конфигурация в настройките на приложението.</string>
<string id="NoHTTPS">Няма отговор, използвайте защитена HTTPS връзка.</string>
<string id="NoInternet">Няма интернет връзка.</string> <string id="NoInternet">Няма интернет връзка.</string>
<string id="NoJson">Не е върнат JSON от HTTP заявка.</string> <string id="NoJson">Не е върнат JSON от HTTP заявка.</string>
<string id="NoMenu">Грешка в дефиницията на менюто, проверете инструкциите.</string> <string id="NoMenu">Грешка в дефиницията на менюто, проверете инструкциите.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Žádný klíč API v nastavení aplikace.</string> <string id="NoAPIKey" scope="glance">Žádný klíč API v nastavení aplikace.</string>
<string id="NoApiUrl" scope="glance">Žádná URL API v nastavení aplikace.</string> <string id="NoApiUrl" scope="glance">Žádná URL API v nastavení aplikace.</string>
<string id="NoConfigUrl" scope="glance">Žádná konfigurační URL v nastavení aplikace.</string> <string id="NoConfigUrl" scope="glance">Žádná konfigurační URL v nastavení aplikace.</string>
<string id="NoHTTPS">Žádná odpověď, použijte zabezpečené připojení HTTPS.</string>
<string id="NoInternet">Žádné připojení k internetu.</string> <string id="NoInternet">Žádné připojení k internetu.</string>
<string id="NoJson">Žádný JSON se nevrátil z požadavku HTTP.</string> <string id="NoJson">Žádný JSON se nevrátil z požadavku HTTP.</string>
<string id="NoMenu">Chyba definice menu, zkontrolujte pokyny.</string> <string id="NoMenu">Chyba definice menu, zkontrolujte pokyny.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Danish Generated by Google Translate and gemini-2.5-flash from English to Danish
Genereret af Google Oversæt og gemini-2.5-flash fra engelsk til dansk Genereret af Google Translate og gemini-2.5-flash fra engelsk til dansk
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Ingen API-nøgle i applikationsindstillingerne.</string> <string id="NoAPIKey" scope="glance">Ingen API-nøgle i applikationsindstillingerne.</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsindstillingerne.</string> <string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsindstillingerne.</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsindstillingerne.</string> <string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsindstillingerne.</string>
<string id="NoHTTPS">Intet svar, brug sikker HTTPS-forbindelse.</string>
<string id="NoInternet">Ingen internetforbindelse.</string> <string id="NoInternet">Ingen internetforbindelse.</string>
<string id="NoJson">Ingen JSON modtaget fra HTTP-anmodning.</string> <string id="NoJson">Ingen JSON modtaget fra HTTP-anmodning.</string>
<string id="NoMenu">Menudefinitionsfejl, tjek instruktionerne.</string> <string id="NoMenu">Menudefinitionsfejl, tjek instruktionerne.</string>
+3 -2
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Kein API-Schlüssel in den App-Einstellungen hinterlegt.</string> <string id="NoAPIKey" scope="glance">Kein API-Schlüssel in den App-Einstellungen hinterlegt.</string>
<string id="NoApiUrl" scope="glance">Keine API-URL in den App-Einstellungen hinterlegt.</string> <string id="NoApiUrl" scope="glance">Keine API-URL in den App-Einstellungen hinterlegt.</string>
<string id="NoConfigUrl" scope="glance">Keine Menükonfigurations-URL (JSON) in den App-Einstellungen hinterlegt.</string> <string id="NoConfigUrl" scope="glance">Keine Menükonfigurations-URL (JSON) in den App-Einstellungen hinterlegt.</string>
<string id="NoHTTPS">Keine Antwort, sichere HTTPS-Verbindung verwenden.</string>
<string id="NoInternet">Keine Internetverbindung.</string> <string id="NoInternet">Keine Internetverbindung.</string>
<string id="NoJson">Keine JSON-Datei aus der HTTP-Anfrage zurückbekommen.</string> <string id="NoJson">Keine JSON-Datei aus der HTTP-Anfrage zurückbekommen.</string>
<string id="NoMenu">Fehler in der Menüdefinition, Anweisungen prüfen.</string> <string id="NoMenu">Fehler in der Menüdefinition, Anweisungen prüfen.</string>
@@ -81,9 +82,9 @@
<string id="SettingsUserHttpHeader">Zusätzlicher HTTP-Header</string> <string id="SettingsUserHttpHeader">Zusätzlicher HTTP-Header</string>
<string id="SettingsUserHttpHeaderDescription">Einige Home Assistant-Installationen erfordern die Angabe eines benutzerdefinierten HTTP-Headers, um zu funktionieren.</string> <string id="SettingsUserHttpHeaderDescription">Einige Home Assistant-Installationen erfordern die Angabe eines benutzerdefinierten HTTP-Headers, um zu funktionieren.</string>
<string id="SettingsUserHttpHeader1Name">Zusätzlicher HTTP-Header 1: Name</string> <string id="SettingsUserHttpHeader1Name">Zusätzlicher HTTP-Header 1: Name</string>
<string id="SettingsUserHttpHeader1Value">Zusätzlicher HTTP-Header 1: Wert</string> <string id="SettingsUserHttpHeader1Value">Zusätzlicher HTTP-Header 1: Value</string>
<string id="SettingsUserHttpHeader2Name">Zusätzlicher HTTP-Header 2: Name</string> <string id="SettingsUserHttpHeader2Name">Zusätzlicher HTTP-Header 2: Name</string>
<string id="SettingsUserHttpHeader2Value">Zusätzlicher HTTP-Header 2: Wert</string> <string id="SettingsUserHttpHeader2Value">Zusätzlicher HTTP-Header 2: Value</string>
<string id="SettingsClearWebhookId">Neu mit Home Assistant verbinden (Webhook-ID löschen, siehe Fehlerbehebungshandbuch).</string> <string id="SettingsClearWebhookId">Neu mit Home Assistant verbinden (Webhook-ID löschen, siehe Fehlerbehebungshandbuch).</string>
<string id="SettingsWebhookId">(Nur lesen) Die vom Gerät erstellte Webhook-ID für Hintergrund-Updates. Kann zum Debuggen benötigt werden.</string> <string id="SettingsWebhookId">(Nur lesen) Die vom Gerät erstellte Webhook-ID für Hintergrund-Updates. Kann zum Debuggen benötigt werden.</string>
</strings> </strings>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Geen API-sleutel in de toepassingsinstellingen.</string> <string id="NoAPIKey" scope="glance">Geen API-sleutel in de toepassingsinstellingen.</string>
<string id="NoApiUrl" scope="glance">Geen API-URL in de toepassingsinstellingen.</string> <string id="NoApiUrl" scope="glance">Geen API-URL in de toepassingsinstellingen.</string>
<string id="NoConfigUrl" scope="glance">Geen configuratie-URL in de toepassingsinstellingen.</string> <string id="NoConfigUrl" scope="glance">Geen configuratie-URL in de toepassingsinstellingen.</string>
<string id="NoHTTPS">Geen antwoord, gebruik een beveiligde HTTPS-verbinding.</string>
<string id="NoInternet">Geen internetverbinding.</string> <string id="NoInternet">Geen internetverbinding.</string>
<string id="NoJson">Geen JSON ontvangen van het HTTP-verzoek.</string> <string id="NoJson">Geen JSON ontvangen van het HTTP-verzoek.</string>
<string id="NoMenu">Menudefinitiefout, controleer de instructies.</string> <string id="NoMenu">Menudefinitiefout, controleer de instructies.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Rakenduse seadetes pole API võtit.</string> <string id="NoAPIKey" scope="glance">Rakenduse seadetes pole API võtit.</string>
<string id="NoApiUrl" scope="glance">Rakenduse seadetes pole API URL-i.</string> <string id="NoApiUrl" scope="glance">Rakenduse seadetes pole API URL-i.</string>
<string id="NoConfigUrl" scope="glance">Rakenduse seadetes pole konfiguratsiooni URL-i.</string> <string id="NoConfigUrl" scope="glance">Rakenduse seadetes pole konfiguratsiooni URL-i.</string>
<string id="NoHTTPS">Vastust pole, kasuta turvalist HTTPS-ühendust.</string>
<string id="NoInternet">Interneti-ühendust pole.</string> <string id="NoInternet">Interneti-ühendust pole.</string>
<string id="NoJson">HTTP päring ei tagastanud JSON-i.</string> <string id="NoJson">HTTP päring ei tagastanud JSON-i.</string>
<string id="NoMenu">Menüü määratluse viga, kontrollige juhiseid.</string> <string id="NoMenu">Menüü määratluse viga, kontrollige juhiseid.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Finnish Generated by Google Translate and gemini-2.5-flash from English to Finnish
Generoinut Google Translate ja gemini-2.5-flash englannista suomeksi Kääntänyt Google Translate ja gemini-2.5-flash englannista suomeksi
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Ei API-avainta sovellusasetuksissa.</string> <string id="NoAPIKey" scope="glance">Ei API-avainta sovellusasetuksissa.</string>
<string id="NoApiUrl" scope="glance">Ei API-URL-osoitetta sovellusasetuksissa.</string> <string id="NoApiUrl" scope="glance">Ei API-URL-osoitetta sovellusasetuksissa.</string>
<string id="NoConfigUrl" scope="glance">Ei määritys-URL-osoitetta sovellusasetuksissa.</string> <string id="NoConfigUrl" scope="glance">Ei määritys-URL-osoitetta sovellusasetuksissa.</string>
<string id="NoHTTPS">Ei vastausta, käytä suojattua HTTPS-yhteyttä.</string>
<string id="NoInternet">Ei Internet-yhteyttä.</string> <string id="NoInternet">Ei Internet-yhteyttä.</string>
<string id="NoJson">HTTP-pyynnöstä ei palautettu JSONia.</string> <string id="NoJson">HTTP-pyynnöstä ei palautettu JSONia.</string>
<string id="NoMenu">Valikon määritysvirhe, tarkista ohjeet.</string> <string id="NoMenu">Valikon määritysvirhe, tarkista ohjeet.</string>
+1
View File
@@ -39,6 +39,7 @@
<string id="NoApiUrl" scope="glance">Aucune URL de l'API dans les paramètres de l'application.</string> <string id="NoApiUrl" scope="glance">Aucune URL de l'API dans les paramètres de l'application.</string>
<string id="NoConfigUrl" scope="glance">Aucune URL de configuration dans les paramètres de <string id="NoConfigUrl" scope="glance">Aucune URL de configuration dans les paramètres de
l'application.</string> l'application.</string>
<string id="NoHTTPS">Aucune réponse, utilisez une connexion HTTPS sécurisée.</string>
<string id="NoInternet">Pas de connexion Internet.</string> <string id="NoInternet">Pas de connexion Internet.</string>
<string id="NoJson">Aucun JSON n'est retourné par la requête HTTP.</string> <string id="NoJson">Aucun JSON n'est retourné par la requête HTTP.</string>
<string id="NoMenu">Erreur de définition du menu, vérifiez les instructions.</string> <string id="NoMenu">Erreur de définition du menu, vérifiez les instructions.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Greek Generated by Google Translate and gemini-2.5-flash from English to Greek
Δημιουργήθηκε από το Google Translate και το gemini-2.5-flash από Αγγλικά σε Ελληνικά Δημιουργήθηκε από Google Translate και gemini-2.5-flash από Αγγλικά σε Ελληνικά
--> -->
<strings> <strings>
@@ -38,6 +38,7 @@
<string id="NoApiUrl" scope="glance">Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις εφαρμογής.</string> <string id="NoApiUrl" scope="glance">Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις εφαρμογής.</string>
<string id="NoConfigUrl" scope="glance">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις <string id="NoConfigUrl" scope="glance">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις
εφαρμογής.</string> εφαρμογής.</string>
<string id="NoHTTPS">Καμία απόκριση, χρησιμοποιήστε ασφαλή σύνδεση HTTPS.</string>
<string id="NoInternet">Χωρίς σύνδεση στο Διαδίκτυο.</string> <string id="NoInternet">Χωρίς σύνδεση στο Διαδίκτυο.</string>
<string id="NoJson">Κανένα JSON δεν επεστράφη από το αίτημα HTTP.</string> <string id="NoJson">Κανένα JSON δεν επεστράφη από το αίτημα HTTP.</string>
<string id="NoMenu">Σφάλμα ορισμού μενού, ελέγξτε τις οδηγίες.</string> <string id="NoMenu">Σφάλμα ορισμού μενού, ελέγξτε τις οδηγίες.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">אין מפתח API בהגדרות היישום.</string> <string id="NoAPIKey" scope="glance">אין מפתח API בהגדרות היישום.</string>
<string id="NoApiUrl" scope="glance">אין כתובת URL של ה-API בהגדרות היישום.</string> <string id="NoApiUrl" scope="glance">אין כתובת URL של ה-API בהגדרות היישום.</string>
<string id="NoConfigUrl" scope="glance">אין כתובת URL לתצורה בהגדרות היישום.</string> <string id="NoConfigUrl" scope="glance">אין כתובת URL לתצורה בהגדרות היישום.</string>
<string id="NoHTTPS">אין תגובה, השתמש בחיבור HTTPS מאובטח.</string>
<string id="NoInternet">אין חיבור לאינטרנט.</string> <string id="NoInternet">אין חיבור לאינטרנט.</string>
<string id="NoJson">לא התקבל JSON מבקשת HTTP.</string> <string id="NoJson">לא התקבל JSON מבקשת HTTP.</string>
<string id="NoMenu">שגיאת הגדרת תפריט, בדוק את ההוראות.</string> <string id="NoMenu">שגיאת הגדרת תפריט, בדוק את ההוראות.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Nema API ključa u postavkama aplikacije.</string> <string id="NoAPIKey" scope="glance">Nema API ključa u postavkama aplikacije.</string>
<string id="NoApiUrl" scope="glance">Nema API URL-a u postavkama aplikacije.</string> <string id="NoApiUrl" scope="glance">Nema API URL-a u postavkama aplikacije.</string>
<string id="NoConfigUrl" scope="glance">Nema URL-a konfiguracije u postavkama aplikacije.</string> <string id="NoConfigUrl" scope="glance">Nema URL-a konfiguracije u postavkama aplikacije.</string>
<string id="NoHTTPS">Nema odgovora, koristite sigurnu HTTPS vezu.</string>
<string id="NoInternet">Nema internetske veze.</string> <string id="NoInternet">Nema internetske veze.</string>
<string id="NoJson">Nije primljen JSON odgovor na HTTP zahtjev.</string> <string id="NoJson">Nije primljen JSON odgovor na HTTP zahtjev.</string>
<string id="NoMenu">Pogreška u definiciji izbornika, provjerite upute.</string> <string id="NoMenu">Pogreška u definiciji izbornika, provjerite upute.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Nincs API kulcs az alkalmazás beállításaiban.</string> <string id="NoAPIKey" scope="glance">Nincs API kulcs az alkalmazás beállításaiban.</string>
<string id="NoApiUrl" scope="glance">Nincs API URL az alkalmazás beállításaiban.</string> <string id="NoApiUrl" scope="glance">Nincs API URL az alkalmazás beállításaiban.</string>
<string id="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazás beállításaiban.</string> <string id="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazás beállításaiban.</string>
<string id="NoHTTPS">Nincs válasz, használjon biztonságos HTTPS kapcsolatot.</string>
<string id="NoInternet">Nincs internetkapcsolat.</string> <string id="NoInternet">Nincs internetkapcsolat.</string>
<string id="NoJson">A HTTP kérés nem adott vissza JSON-t.</string> <string id="NoJson">A HTTP kérés nem adott vissza JSON-t.</string>
<string id="NoMenu">Menüdefiníciós hiba, ellenőrizze az utasításokat.</string> <string id="NoMenu">Menüdefiníciós hiba, ellenőrizze az utasításokat.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Tidak ada kunci API di pengaturan aplikasi.</string> <string id="NoAPIKey" scope="glance">Tidak ada kunci API di pengaturan aplikasi.</string>
<string id="NoApiUrl" scope="glance">Tidak ada URL API di pengaturan aplikasi.</string> <string id="NoApiUrl" scope="glance">Tidak ada URL API di pengaturan aplikasi.</string>
<string id="NoConfigUrl" scope="glance">Tidak ada URL konfigurasi di pengaturan aplikasi.</string> <string id="NoConfigUrl" scope="glance">Tidak ada URL konfigurasi di pengaturan aplikasi.</string>
<string id="NoHTTPS">Tidak ada respons, gunakan koneksi HTTPS aman.</string>
<string id="NoInternet">Tidak ada koneksi internet.</string> <string id="NoInternet">Tidak ada koneksi internet.</string>
<string id="NoJson">Tidak ada JSON yang diterima dari permintaan HTTP.</string> <string id="NoJson">Tidak ada JSON yang diterima dari permintaan HTTP.</string>
<string id="NoMenu">Kesalahan definisi menu, periksa instruksi.</string> <string id="NoMenu">Kesalahan definisi menu, periksa instruksi.</string>
+1
View File
@@ -38,6 +38,7 @@
<string id="NoApiUrl" scope="glance">Nessun URL API nelle impostazioni dell'applicazione.</string> <string id="NoApiUrl" scope="glance">Nessun URL API nelle impostazioni dell'applicazione.</string>
<string id="NoConfigUrl" scope="glance">Nessun URL di configurazione nelle impostazioni <string id="NoConfigUrl" scope="glance">Nessun URL di configurazione nelle impostazioni
dell'applicazione.</string> dell'applicazione.</string>
<string id="NoHTTPS">Nessuna risposta, usa una connessione HTTPS sicura.</string>
<string id="NoInternet">Nessuna connessione Internet.</string> <string id="NoInternet">Nessuna connessione Internet.</string>
<string id="NoJson">Nessun JSON ricevuto dalla richiesta HTTP.</string> <string id="NoJson">Nessun JSON ricevuto dalla richiesta HTTP.</string>
<string id="NoMenu">Errore di definizione del menu, controlla le istruzioni.</string> <string id="NoMenu">Errore di definizione del menu, controlla le istruzioni.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">アプリケーション設定にAPIキーはありません。</string> <string id="NoAPIKey" scope="glance">アプリケーション設定にAPIキーはありません。</string>
<string id="NoApiUrl" scope="glance">アプリケーション設定にAPI URLはありません。</string> <string id="NoApiUrl" scope="glance">アプリケーション設定にAPI URLはありません。</string>
<string id="NoConfigUrl" scope="glance">アプリケーション設定に構成URLはありません。</string> <string id="NoConfigUrl" scope="glance">アプリケーション設定に構成URLはありません。</string>
<string id="NoHTTPS">応答なし、安全なHTTPS接続を使用してください。</string>
<string id="NoInternet">インターネット接続はありません。</string> <string id="NoInternet">インターネット接続はありません。</string>
<string id="NoJson">JSONはHTTPリクエストから返されませんでした。</string> <string id="NoJson">JSONはHTTPリクエストから返されませんでした。</string>
<string id="NoMenu">メニュー定義エラー、手順を確認してください。</string> <string id="NoMenu">メニュー定義エラー、手順を確認してください。</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Korean Generated by Google Translate and gemini-2.5-flash from English to Korean
Google 번역 및 gemini-2.5-flash를 사용하여 영어에서 한국어로 번역 Google 번역 및 gemini-2.5-flash를 사용하여 영어에서 한국어로 생성
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">앱 설정에 API 키가 없습니다.</string> <string id="NoAPIKey" scope="glance">앱 설정에 API 키가 없습니다.</string>
<string id="NoApiUrl" scope="glance">앱 설정에 API URL이 없습니다.</string> <string id="NoApiUrl" scope="glance">앱 설정에 API URL이 없습니다.</string>
<string id="NoConfigUrl" scope="glance">앱 설정에 구성 URL이 없습니다.</string> <string id="NoConfigUrl" scope="glance">앱 설정에 구성 URL이 없습니다.</string>
<string id="NoHTTPS">응답 없음, 보안 HTTPS 연결을 사용하세요.</string>
<string id="NoInternet">인터넷 연결 없음.</string> <string id="NoInternet">인터넷 연결 없음.</string>
<string id="NoJson">HTTP 요청에서 JSON이 반환되지 않았습니다.</string> <string id="NoJson">HTTP 요청에서 JSON이 반환되지 않았습니다.</string>
<string id="NoMenu">메뉴 정의 오류, 지침을 확인하세요.</string> <string id="NoMenu">메뉴 정의 오류, 지침을 확인하세요.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Lietojumprogrammas iestatījumos nav API atslēgas.</string> <string id="NoAPIKey" scope="glance">Lietojumprogrammas iestatījumos nav API atslēgas.</string>
<string id="NoApiUrl" scope="glance">Lietojumprogrammas iestatījumos nav API URL.</string> <string id="NoApiUrl" scope="glance">Lietojumprogrammas iestatījumos nav API URL.</string>
<string id="NoConfigUrl" scope="glance">Lietojumprogrammas iestatījumos nav konfigurācijas URL.</string> <string id="NoConfigUrl" scope="glance">Lietojumprogrammas iestatījumos nav konfigurācijas URL.</string>
<string id="NoHTTPS">Nav atbildes, izmantojiet drošu HTTPS savienojumu.</string>
<string id="NoInternet">Nav interneta savienojuma.</string> <string id="NoInternet">Nav interneta savienojuma.</string>
<string id="NoJson">HTTP pieprasījums neatgrieza JSON.</string> <string id="NoJson">HTTP pieprasījums neatgrieza JSON.</string>
<string id="NoMenu">Izvēlnes definīcijas kļūda, pārbaudiet instrukcijas.</string> <string id="NoMenu">Izvēlnes definīcijas kļūda, pārbaudiet instrukcijas.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Nėra API rakto programos nustatymuose.</string> <string id="NoAPIKey" scope="glance">Nėra API rakto programos nustatymuose.</string>
<string id="NoApiUrl" scope="glance">Nėra API URL programos nustatymuose.</string> <string id="NoApiUrl" scope="glance">Nėra API URL programos nustatymuose.</string>
<string id="NoConfigUrl" scope="glance">Nėra konfigūracijos URL programos nustatymuose.</string> <string id="NoConfigUrl" scope="glance">Nėra konfigūracijos URL programos nustatymuose.</string>
<string id="NoHTTPS">Jokio atsakymo, naudokite saugų HTTPS ryšį.</string>
<string id="NoInternet">Nėra interneto ryšio.</string> <string id="NoInternet">Nėra interneto ryšio.</string>
<string id="NoJson">HTTP užklausa negrąžino JSON.</string> <string id="NoJson">HTTP užklausa negrąžino JSON.</string>
<string id="NoMenu">Meniu apibrėžimo klaida, patikrinkite instrukcijas.</string> <string id="NoMenu">Meniu apibrėžimo klaida, patikrinkite instrukcijas.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Ingen API-nøkkel i applikasjonsinnstillingene.</string> <string id="NoAPIKey" scope="glance">Ingen API-nøkkel i applikasjonsinnstillingene.</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikasjonsinnstillingene.</string> <string id="NoApiUrl" scope="glance">Ingen API-URL i applikasjonsinnstillingene.</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurasjons-URL i applikasjonsinnstillingene.</string> <string id="NoConfigUrl" scope="glance">Ingen konfigurasjons-URL i applikasjonsinnstillingene.</string>
<string id="NoHTTPS">Ingen svar, bruk sikker HTTPS-tilkobling.</string>
<string id="NoInternet">Ingen internettforbindelse.</string> <string id="NoInternet">Ingen internettforbindelse.</string>
<string id="NoJson">Ingen JSON returnert fra HTTP-forespørsel.</string> <string id="NoJson">Ingen JSON returnert fra HTTP-forespørsel.</string>
<string id="NoMenu">Menydefinisjonsfeil, sjekk instruksjonene.</string> <string id="NoMenu">Menydefinisjonsfeil, sjekk instruksjonene.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Polish Generated by Google Translate and gemini-2.5-flash from English to Polish
Wygenerowano przez Google Translate i gemini-2.5-flash z angielskiego na polski Wygenerowano przez Google Translate i gemini-2.5-flash z języka angielskiego na polski
--> -->
<strings> <strings>
@@ -38,6 +38,7 @@
<string id="NoAPIKey" scope="glance">Brak klucza API w ustawieniach aplikacji.</string> <string id="NoAPIKey" scope="glance">Brak klucza API w ustawieniach aplikacji.</string>
<string id="NoApiUrl" scope="glance">Brak adresu URL API w ustawieniach aplikacji.</string> <string id="NoApiUrl" scope="glance">Brak adresu URL API w ustawieniach aplikacji.</string>
<string id="NoConfigUrl" scope="glance">Brak adresu URL konfiguracji w ustawieniach aplikacji.</string> <string id="NoConfigUrl" scope="glance">Brak adresu URL konfiguracji w ustawieniach aplikacji.</string>
<string id="NoHTTPS">Brak odpowiedzi, użyj bezpiecznego połączenia HTTPS.</string>
<string id="NoInternet">Brak połączenia internetowego.</string> <string id="NoInternet">Brak połączenia internetowego.</string>
<string id="NoJson">Żądanie HTTP nie zwróciło danych JSON.</string> <string id="NoJson">Żądanie HTTP nie zwróciło danych JSON.</string>
<string id="NoMenu">Błąd definicji menu, sprawdź instrukcje.</string> <string id="NoMenu">Błąd definicji menu, sprawdź instrukcje.</string>
+1
View File
@@ -39,6 +39,7 @@
<string id="NoApiUrl" scope="glance">Nenhum URL da API nas configurações do aplicativo.</string> <string id="NoApiUrl" scope="glance">Nenhum URL da API nas configurações do aplicativo.</string>
<string id="NoConfigUrl" scope="glance">Nenhum URL de configuração nas configurações do <string id="NoConfigUrl" scope="glance">Nenhum URL de configuração nas configurações do
aplicativo.</string> aplicativo.</string>
<string id="NoHTTPS">Sem resposta, use conexão HTTPS segura.</string>
<string id="NoInternet">Sem conexão com a Internet.</string> <string id="NoInternet">Sem conexão com a Internet.</string>
<string id="NoJson">Nenhum JSON retornado da solicitação HTTP.</string> <string id="NoJson">Nenhum JSON retornado da solicitação HTTP.</string>
<string id="NoMenu">Erro de definição do menu, verifique as instruções.</string> <string id="NoMenu">Erro de definição do menu, verifique as instruções.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Nicio cheie API în setările aplicației.</string> <string id="NoAPIKey" scope="glance">Nicio cheie API în setările aplicației.</string>
<string id="NoApiUrl" scope="glance">Niciun URL API în setările aplicației.</string> <string id="NoApiUrl" scope="glance">Niciun URL API în setările aplicației.</string>
<string id="NoConfigUrl" scope="glance">Niciun URL de configurare în setările aplicației.</string> <string id="NoConfigUrl" scope="glance">Niciun URL de configurare în setările aplicației.</string>
<string id="NoHTTPS">Niciun răspuns, utilizați o conexiune HTTPS securizată.</string>
<string id="NoInternet">Nicio conexiune la internet.</string> <string id="NoInternet">Nicio conexiune la internet.</string>
<string id="NoJson">Niciun JSON nu a fost returnat de la cererea HTTP.</string> <string id="NoJson">Niciun JSON nu a fost returnat de la cererea HTTP.</string>
<string id="NoMenu">Eroare de definire a meniului, verificați instrucțiunile.</string> <string id="NoMenu">Eroare de definire a meniului, verificați instrucțiunile.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Slovak Generated by Google Translate and gemini-2.5-flash from English to Slovak
Vygenerované službou Google Translate a gemini-2.5-flash z angličtiny do slovenčiny Vygenerované pomocou Google Translate a gemini-2.5-flash z angličtiny do slovenčiny
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">V nastaveniach aplikácie chýba kľúč API</string> <string id="NoAPIKey" scope="glance">V nastaveniach aplikácie chýba kľúč API</string>
<string id="NoApiUrl" scope="glance">V nastaveniach aplikácie chýba adresa URL rozhrania API</string> <string id="NoApiUrl" scope="glance">V nastaveniach aplikácie chýba adresa URL rozhrania API</string>
<string id="NoConfigUrl" scope="glance">V nastaveniach aplikácie chýba konfiguračná adresa URL</string> <string id="NoConfigUrl" scope="glance">V nastaveniach aplikácie chýba konfiguračná adresa URL</string>
<string id="NoHTTPS">Žiadna odpoveď, použite zabezpečené pripojenie HTTPS.</string>
<string id="NoInternet">Žiadne pripojenie na internet.</string> <string id="NoInternet">Žiadne pripojenie na internet.</string>
<string id="NoJson">Z požiadavky HTTP sa nevrátil žiadny JSON.</string> <string id="NoJson">Z požiadavky HTTP sa nevrátil žiadny JSON.</string>
<string id="NoMenu">Chyba definície ponuky, skontrolujte pokyny.</string> <string id="NoMenu">Chyba definície ponuky, skontrolujte pokyny.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Slovenian Generated by Google Translate and gemini-2.5-flash from English to Slovenian
Prevedeno z Google Prevajalnikom in gemini-2.5-flash iz angleščine v slovenščino Prevedel Google Prevajalnik in gemini-2.5-flash iz angleščine v slovenščino
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">V nastavitvah aplikacije ni ključa API -ja.</string> <string id="NoAPIKey" scope="glance">V nastavitvah aplikacije ni ključa API -ja.</string>
<string id="NoApiUrl" scope="glance">V nastavitvah aplikacije ni URL API -ja.</string> <string id="NoApiUrl" scope="glance">V nastavitvah aplikacije ni URL API -ja.</string>
<string id="NoConfigUrl" scope="glance">V nastavitvah aplikacije ni URL konfiguracije.</string> <string id="NoConfigUrl" scope="glance">V nastavitvah aplikacije ni URL konfiguracije.</string>
<string id="NoHTTPS">Brez odgovora, uporabite varno povezavo HTTPS.</string>
<string id="NoInternet">Brez internetne povezave.</string> <string id="NoInternet">Brez internetne povezave.</string>
<string id="NoJson">Zahteva HTTP ni vrnila JSON-a.</string> <string id="NoJson">Zahteva HTTP ni vrnila JSON-a.</string>
<string id="NoMenu">Napaka pri definiciji menija, preverite navodila.</string> <string id="NoMenu">Napaka pri definiciji menija, preverite navodila.</string>
+1
View File
@@ -39,6 +39,7 @@
<string id="NoApiUrl" scope="glance">No hay URL de API en la configuración de la aplicación.</string> <string id="NoApiUrl" scope="glance">No hay URL de API en la configuración de la aplicación.</string>
<string id="NoConfigUrl" scope="glance">No hay URL de configuración en la configuración de la <string id="NoConfigUrl" scope="glance">No hay URL de configuración en la configuración de la
aplicación.</string> aplicación.</string>
<string id="NoHTTPS">Sin respuesta, utilice una conexión HTTPS segura.</string>
<string id="NoInternet">Sin conexión a Internet.</string> <string id="NoInternet">Sin conexión a Internet.</string>
<string id="NoJson">No se recibió JSON de la solicitud HTTP.</string> <string id="NoJson">No se recibió JSON de la solicitud HTTP.</string>
<string id="NoMenu">Error en la definición del menú, verifique las instrucciones.</string> <string id="NoMenu">Error en la definición del menú, verifique las instrucciones.</string>
+1
View File
@@ -37,6 +37,7 @@
<string id="NoAPIKey" scope="glance">Ingen API-nyckel i applikationsinställningarna.</string> <string id="NoAPIKey" scope="glance">Ingen API-nyckel i applikationsinställningarna.</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsinställningarna.</string> <string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsinställningarna.</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsinställningarna.</string> <string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsinställningarna.</string>
<string id="NoHTTPS">Inget svar, använd säker HTTPS-anslutning.</string>
<string id="NoInternet">Ingen internetanslutning.</string> <string id="NoInternet">Ingen internetanslutning.</string>
<string id="NoJson">Ingen JSON returnerades från HTTP-begäran.</string> <string id="NoJson">Ingen JSON returnerades från HTTP-begäran.</string>
<string id="NoMenu">Menydefinitionfel, kontrollera instruktionerna.</string> <string id="NoMenu">Menydefinitionfel, kontrollera instruktionerna.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน</string> <string id="NoAPIKey" scope="glance">ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน</string>
<string id="NoApiUrl" scope="glance">ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน</string> <string id="NoApiUrl" scope="glance">ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน</string>
<string id="NoConfigUrl" scope="glance">ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน</string> <string id="NoConfigUrl" scope="glance">ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน</string>
<string id="NoHTTPS">ไม่มีการตอบกลับ ใช้การเชื่อมต่อ HTTPS ที่ปลอดภัย</string>
<string id="NoInternet">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string> <string id="NoInternet">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>
<string id="NoJson">ไม่มี JSON ส่งคืนจากคำขอ HTTP</string> <string id="NoJson">ไม่มี JSON ส่งคืนจากคำขอ HTTP</string>
<string id="NoMenu">ข้อผิดพลาดในการกำหนดเมนู โปรดตรวจสอบคำแนะนำ</string> <string id="NoMenu">ข้อผิดพลาดในการกำหนดเมนู โปรดตรวจสอบคำแนะนำ</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Turkish Generated by Google Translate and gemini-2.5-flash from English to Turkish
Google Translate ve gemini-2.5-flash tarafından İngilizceden Türkçeye çevrildi Google Translate ve gemini-2.5-flash tarafından İngilizceden Türkçeye çevrilmiştir
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Uygulama ayarlarında API anahtarı yok.</string> <string id="NoAPIKey" scope="glance">Uygulama ayarlarında API anahtarı yok.</string>
<string id="NoApiUrl" scope="glance">Uygulama ayarlarında API URL'si yok.</string> <string id="NoApiUrl" scope="glance">Uygulama ayarlarında API URL'si yok.</string>
<string id="NoConfigUrl" scope="glance">Uygulama ayarlarında yapılandırma URL'si yok.</string> <string id="NoConfigUrl" scope="glance">Uygulama ayarlarında yapılandırma URL'si yok.</string>
<string id="NoHTTPS">Yanıt yok, güvenli HTTPS bağlantısı kullanın.</string>
<string id="NoInternet">İnternet bağlantısı yok.</string> <string id="NoInternet">İnternet bağlantısı yok.</string>
<string id="NoJson">HTTP isteğinden JSON dönmedi.</string> <string id="NoJson">HTTP isteğinden JSON dönmedi.</string>
<string id="NoMenu">Menü tanım hatası, talimatları kontrol edin.</string> <string id="NoMenu">Menü tanım hatası, talimatları kontrol edin.</string>
+1
View File
@@ -38,6 +38,7 @@
<string id="NoAPIKey" scope="glance">Немає ключа API в налаштуваннях програми.</string> <string id="NoAPIKey" scope="glance">Немає ключа API в налаштуваннях програми.</string>
<string id="NoApiUrl" scope="glance">Немає URL-адреси API в налаштуваннях програми.</string> <string id="NoApiUrl" scope="glance">Немає URL-адреси API в налаштуваннях програми.</string>
<string id="NoConfigUrl" scope="glance">Немає URL-адреси конфігурації в налаштуваннях програми.</string> <string id="NoConfigUrl" scope="glance">Немає URL-адреси конфігурації в налаштуваннях програми.</string>
<string id="NoHTTPS">Немає відповіді, використовуйте безпечне HTTPS-з'єднання.</string>
<string id="NoInternet">Немає підключення до Інтернету.</string> <string id="NoInternet">Немає підключення до Інтернету.</string>
<string id="NoJson">HTTP-запит не повернув JSON.</string> <string id="NoJson">HTTP-запит не повернув JSON.</string>
<string id="NoMenu">Помилка визначення меню, перевірте інструкції.</string> <string id="NoMenu">Помилка визначення меню, перевірте інструкції.</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Không có khóa API trong cài đặt ứng dụng.</string> <string id="NoAPIKey" scope="glance">Không có khóa API trong cài đặt ứng dụng.</string>
<string id="NoApiUrl" scope="glance">Không có URL API trong cài đặt ứng dụng.</string> <string id="NoApiUrl" scope="glance">Không có URL API trong cài đặt ứng dụng.</string>
<string id="NoConfigUrl" scope="glance">Không có URL cấu hình trong cài đặt ứng dụng.</string> <string id="NoConfigUrl" scope="glance">Không có URL cấu hình trong cài đặt ứng dụng.</string>
<string id="NoHTTPS">Không có phản hồi, sử dụng kết nối HTTPS an toàn.</string>
<string id="NoInternet">Không có kết nối internet.</string> <string id="NoInternet">Không có kết nối internet.</string>
<string id="NoJson">Không có JSON được trả về từ yêu cầu HTTP.</string> <string id="NoJson">Không có JSON được trả về từ yêu cầu HTTP.</string>
<string id="NoMenu">Lỗi định nghĩa menu, kiểm tra hướng dẫn.</string> <string id="NoMenu">Lỗi định nghĩa menu, kiểm tra hướng dẫn.</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Chinese (Simplified) Generated by Google Translate and gemini-2.5-flash from English to Chinese (Simplified)
由 Google 翻译和 gemini-2.5-flash 从英语翻译成简体中文 由 Google 翻译和 gemini-2.5-flash 从英语翻译成中文(简体)
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">应用程序设置中没有 API 密钥。</string> <string id="NoAPIKey" scope="glance">应用程序设置中没有 API 密钥。</string>
<string id="NoApiUrl" scope="glance">应用程序设置中没有 API URL。</string> <string id="NoApiUrl" scope="glance">应用程序设置中没有 API URL。</string>
<string id="NoConfigUrl" scope="glance">应用程序设置中没有配置 URL。</string> <string id="NoConfigUrl" scope="glance">应用程序设置中没有配置 URL。</string>
<string id="NoHTTPS">没有回应,请使用安全的 HTTPS 连接。</string>
<string id="NoInternet">没有互联网连接。</string> <string id="NoInternet">没有互联网连接。</string>
<string id="NoJson">HTTP 请求未返回 JSON。</string> <string id="NoJson">HTTP 请求未返回 JSON。</string>
<string id="NoMenu">菜单定义错误,请检查说明。</string> <string id="NoMenu">菜单定义错误,请检查说明。</string>
+1
View File
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">應用程式設定中沒有 API 密鑰。</string> <string id="NoAPIKey" scope="glance">應用程式設定中沒有 API 密鑰。</string>
<string id="NoApiUrl" scope="glance">應用程式設定中沒有 API URL。</string> <string id="NoApiUrl" scope="glance">應用程式設定中沒有 API URL。</string>
<string id="NoConfigUrl" scope="glance">應用程式設定中沒有配置 URL。</string> <string id="NoConfigUrl" scope="glance">應用程式設定中沒有配置 URL。</string>
<string id="NoHTTPS">沒有回應,請使用安全的 HTTPS 連線。</string>
<string id="NoInternet">沒有互聯網連接。</string> <string id="NoInternet">沒有互聯網連接。</string>
<string id="NoJson">HTTP 請求未返回 JSON。</string> <string id="NoJson">HTTP 請求未返回 JSON。</string>
<string id="NoMenu">選單定義錯誤,請檢查說明。</string> <string id="NoMenu">選單定義錯誤,請檢查說明。</string>
+2 -1
View File
@@ -15,7 +15,7 @@
<!-- <!--
Generated by Google Translate and gemini-2.5-flash from English to Standard (Bahasa) Malay Generated by Google Translate and gemini-2.5-flash from English to Standard (Bahasa) Malay
Dihasilkan oleh Google Translate dan gemini-2.5-flash dari Bahasa Inggeris ke Bahasa Melayu Standard (Bahasa) Dijana oleh Google Translate dan gemini-2.5-flash daripada Bahasa Inggeris ke Bahasa Melayu Standard (Bahasa)
--> -->
<strings> <strings>
@@ -36,6 +36,7 @@
<string id="NoAPIKey" scope="glance">Tiada kunci API dalam tetapan aplikasi.</string> <string id="NoAPIKey" scope="glance">Tiada kunci API dalam tetapan aplikasi.</string>
<string id="NoApiUrl" scope="glance">Tiada URL API dalam tetapan aplikasi.</string> <string id="NoApiUrl" scope="glance">Tiada URL API dalam tetapan aplikasi.</string>
<string id="NoConfigUrl" scope="glance">Tiada URL konfigurasi dalam tetapan aplikasi.</string> <string id="NoConfigUrl" scope="glance">Tiada URL konfigurasi dalam tetapan aplikasi.</string>
<string id="NoHTTPS">Tiada respons, gunakan sambungan HTTPS selamat.</string>
<string id="NoInternet">Tiada sambungan internet.</string> <string id="NoInternet">Tiada sambungan internet.</string>
<string id="NoJson">Tiada JSON dikembalikan daripada permintaan HTTP.</string> <string id="NoJson">Tiada JSON dikembalikan daripada permintaan HTTP.</string>
<string id="NoMenu">Ralat definisi menu, semak arahan.</string> <string id="NoMenu">Ralat definisi menu, semak arahan.</string>
+1
View File
@@ -30,6 +30,7 @@
<string id="NoAPIKey" scope="glance">No API key in the application settings.</string> <string id="NoAPIKey" scope="glance">No API key in the application settings.</string>
<string id="NoApiUrl" scope="glance">No API URL in the application settings.</string> <string id="NoApiUrl" scope="glance">No API URL in the application settings.</string>
<string id="NoConfigUrl" scope="glance">No configuration URL in the application settings.</string> <string id="NoConfigUrl" scope="glance">No configuration URL in the application settings.</string>
<string id="NoHTTPS">No response, use secure HTTPS connection.</string>
<string id="NoInternet">No Internet connection.</string> <string id="NoInternet">No Internet connection.</string>
<string id="NoJson">No JSON returned from HTTP request.</string> <string id="NoJson">No JSON returned from HTTP request.</string>
<string id="NoMenu">Menu definition error, check the instructions.</string> <string id="NoMenu">Menu definition error, check the instructions.</string>
+7 -4
View File
@@ -115,15 +115,18 @@ class BackgroundServiceDelegate extends System.ServiceDelegate {
// System.println("BackgroundServiceDelegate onTemporalEvent(): Activity : " + Activity.getProfileInfo().name); // System.println("BackgroundServiceDelegate onTemporalEvent(): Activity : " + Activity.getProfileInfo().name);
// Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run // Don't use Settings.* here as the object lasts < 30 secs and is recreated each time the background service is run
if (position.accuracy != Position.QUALITY_NOT_AVAILABLE) {
if (position.accuracy != Position.QUALITY_NOT_AVAILABLE && position.accuracy != Position.QUALITY_LAST_KNOWN) {
var accuracy = 0; var accuracy = 0;
switch (position.accuracy) { switch (position.accuracy) {
case Position.QUALITY_LAST_KNOWN:
// Location is no longer tied to the timestamp, hence the larger inaccuracy.
accuracy = 200;
break;
case Position.QUALITY_POOR: case Position.QUALITY_POOR:
accuracy = 500; accuracy = 100;
break; break;
case Position.QUALITY_USABLE: case Position.QUALITY_USABLE:
accuracy = 100; accuracy = 50;
break; break;
case Position.QUALITY_GOOD: case Position.QUALITY_GOOD:
accuracy = 10; accuracy = 10;
+21
View File
@@ -195,6 +195,13 @@ class HomeAssistantApp extends Application.AppBase {
} }
break; break;
case Communications.SECURE_CONNECTION_REQUIRED:
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: SECURE_CONNECTION_REQUIRED, check API URL setting.");
if (mIsApp) {
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoHTTPS) as Lang.String);
}
break;
case 404: case 404:
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting."); // System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
if (mIsApp) { if (mIsApp) {
@@ -508,6 +515,13 @@ class HomeAssistantApp extends Application.AppBase {
myTimer.start(method(:updateMenuItems), Globals.scApiBackoffMs, false); myTimer.start(method(:updateMenuItems), Globals.scApiBackoffMs, false);
break; break;
case Communications.SECURE_CONNECTION_REQUIRED:
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: SECURE_CONNECTION_REQUIRED, check API URL setting.");
if (mIsApp) {
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoHTTPS) as Lang.String);
}
break;
case 404: case 404:
// System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: 404, page not found. Check API URL setting."); // System.println("HomeAssistantApp onReturnCheckMenuConfig() Response Code: 404, page not found. Check API URL setting.");
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String); ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound) as Lang.String);
@@ -798,6 +812,13 @@ class HomeAssistantApp extends Application.AppBase {
} }
break; break;
case Communications.SECURE_CONNECTION_REQUIRED:
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: SECURE_CONNECTION_REQUIRED, check API URL setting.");
if (mIsApp) {
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoHTTPS) as Lang.String);
}
break;
case 404: case 404:
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: 404, page not found. Check Configuration URL setting."); // System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: 404, page not found. Check Configuration URL setting.");
if (mIsApp) { if (mIsApp) {
+7 -3
View File
@@ -112,7 +112,7 @@ class HomeAssistantMenuItemFactory {
label as Lang.String or Lang.Symbol, label as Lang.String or Lang.Symbol,
entity_id as Lang.String?, entity_id as Lang.String?,
template as Lang.String?, template as Lang.String?,
action as Lang.String?, action as Lang.String?,
data as Lang.Dictionary?, data as Lang.Dictionary?,
options as { options as {
:exit as Lang.Boolean, :exit as Lang.Boolean,
@@ -163,6 +163,7 @@ class HomeAssistantMenuItemFactory {
entity_id as Lang.String?, entity_id as Lang.String?,
template as Lang.String?, template as Lang.String?,
action as Lang.String?, action as Lang.String?,
data as Lang.Dictionary?,
picker as Lang.Dictionary, picker as Lang.Dictionary,
options as { options as {
:exit as Lang.Boolean, :exit as Lang.Boolean,
@@ -171,9 +172,12 @@ class HomeAssistantMenuItemFactory {
:icon as WatchUi.Bitmap :icon as WatchUi.Bitmap
} }
) as WatchUi.MenuItem { ) as WatchUi.MenuItem {
var data = null;
if (entity_id != null) { if (entity_id != null) {
data = { "entity_id" => entity_id }; if (data == null) {
data = { "entity_id" => entity_id };
} else {
data["entity_id"] = entity_id;
}
} }
var keys = mMenuItemOptions.keys(); var keys = mMenuItemOptions.keys();
for (var i = 0; i < keys.size(); i++) { for (var i = 0; i < keys.size(); i++) {
+14 -5
View File
@@ -155,7 +155,10 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem {
// //
function onConfirm(b as Lang.Boolean) as Void { function onConfirm(b as Lang.Boolean) as Void {
var dataAttribute = mPicker["data_attribute"] as Lang.String?; var dataAttribute = mPicker["data_attribute"] as Lang.String?;
var entity_id = mData["entity_id"] as Lang.String?; var entity_id = null as Lang.String?;
if (mData != null) {
entity_id = mData["entity_id"] as Lang.String?;
}
WatchUi.popView(WatchUi.SLIDE_RIGHT); WatchUi.popView(WatchUi.SLIDE_RIGHT);
WatchUi.requestUpdate(); WatchUi.requestUpdate();
@@ -164,12 +167,18 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem {
return; return;
} }
if (mAction != null) { if (mAction != null) {
var data = {} as Lang.Dictionary;
if (mData != null) {
var keys = mData.keys();
for (var i = 0; i < keys.size(); i++) {
data[keys[i]] = mData[keys[i]];
}
}
data["entity_id"] = entity_id.toString();
data[dataAttribute.toString()] = mValue;
mHomeAssistantService.call( mHomeAssistantService.call(
mAction, mAction,
{ data,
"entity_id" => entity_id.toString(),
dataAttribute.toString() => mValue
},
mExit mExit
); );
} }
+1
View File
@@ -122,6 +122,7 @@ class HomeAssistantService {
//! //!
//! @param action The Home Assistant action to be run, e.g. from the JSON `action` field. //! @param action The Home Assistant action to be run, e.g. from the JSON `action` field.
//! @param data Data to be supplied to the action call. //! @param data Data to be supplied to the action call.
//! @param exit Whether to exit the app after making the call.
// //
function call( function call(
action as Lang.String, action as Lang.String,
+1 -3
View File
@@ -228,9 +228,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
// If there's no response body, let's assume that what we did actually happened and flip the toggle. // If there's no response body, let's assume that what we did actually happened and flip the toggle.
if (data.size() == 0) { if (data.size() == 0) {
setEnabled(!isEnabled()); setEnabled(!isEnabled());
} } else {
else {
for(var i = 0; i < data.size(); i++) { for(var i = 0; i < data.size(); i++) {
if ((data[i].get("entity_id") as Lang.String).equals(mData.get("entity_id"))) { if ((data[i].get("entity_id") as Lang.String).equals(mData.get("entity_id"))) {
var state = data[i].get("state") as Lang.String; var state = data[i].get("state") as Lang.String;
+73 -58
View File
@@ -76,49 +76,32 @@ class HomeAssistantView extends WatchUi.Menu2 {
} }
} }
if (type != null && name != null && enabled) { if (type != null && name != null && enabled) {
if (type.equals("toggle") && entity != null) { if (pin && !System.getDeviceSettings().isTouchScreen) {
addItem(HomeAssistantMenuItemFactory.create().toggle(
name,
entity,
content,
{
:exit => exit,
:confirm => confirm,
:pin => pin
}
));
} else if (type.equals("tap") && action != null) {
addItem(HomeAssistantMenuItemFactory.create().tap( addItem(HomeAssistantMenuItemFactory.create().tap(
name, "PIN requires Touchscreen",
entity, null,
content, null,
action, null,
data, data,
{ {
:exit => exit, :exit => false,
:confirm => confirm, :confirm => false,
:pin => pin :pin => false
} }
)); ));
} else if (type.equals("template") && content != null) { } else {
// NB. "template" is deprecated in the schema and remains only for backward compatibility. All menu items can now use templates, so the replacement is "info". if (type.equals("toggle") && entity != null) {
// The exit option is dependent on the type of template. addItem(HomeAssistantMenuItemFactory.create().toggle(
if (tap_action == null) {
// No exit from an information only item
addItem(HomeAssistantMenuItemFactory.create().tap(
name, name,
entity, entity,
content, content,
action,
data,
{ {
:exit => false, :exit => exit,
:confirm => confirm, :confirm => confirm,
:pin => pin :pin => pin
} }
)); ));
} else { } else if (type.equals("tap") && action != null) {
// You may exit from template item with a 'tap_action'.
addItem(HomeAssistantMenuItemFactory.create().tap( addItem(HomeAssistantMenuItemFactory.create().tap(
name, name,
entity, entity,
@@ -131,17 +114,31 @@ class HomeAssistantView extends WatchUi.Menu2 {
:pin => pin :pin => pin
} }
)); ));
} } else if (type.equals("template") && content != null) {
} else if (type.equals("numeric") && action != null) { // NB. "template" is deprecated in the schema and remains only for backward compatibility. All menu items can now use templates, so the replacement is "info".
if (tap_action != null) { // The exit option is dependent on the type of template.
var picker = tap_action.get("picker") as Lang.Dictionary?; if (tap_action == null) {
if (picker != null) { // No exit from an information only item
addItem(HomeAssistantMenuItemFactory.create().numeric( addItem(HomeAssistantMenuItemFactory.create().tap(
name, name,
entity, entity,
content, content,
action, action,
picker, data,
{
:exit => false,
:confirm => confirm,
:pin => pin
}
));
} else {
// You may exit from template item with a 'tap_action'.
addItem(HomeAssistantMenuItemFactory.create().tap(
name,
entity,
content,
action,
data,
{ {
:exit => exit, :exit => exit,
:confirm => confirm, :confirm => confirm,
@@ -149,23 +146,43 @@ class HomeAssistantView extends WatchUi.Menu2 {
} }
)); ));
} }
} } else if (type.equals("numeric") && action != null) {
} else if (type.equals("info") && content != null) { // Numeric items are only actionable on touch screen devices.
// Cannot exit from a non-actionable information only menu item. if (tap_action != null) {
addItem(HomeAssistantMenuItemFactory.create().tap( var picker = tap_action.get("picker") as Lang.Dictionary?;
name, if (picker != null) {
entity, addItem(HomeAssistantMenuItemFactory.create().numeric(
content, name,
action, entity,
data, content,
{ action,
:exit => false, data,
:confirm => confirm, picker,
:pin => pin {
:exit => exit,
:confirm => confirm,
:pin => pin
}
));
}
} }
)); } else if (type.equals("info") && content != null) {
} else if (type.equals("group")) { // Cannot exit from a non-actionable information only menu item.
addItem(HomeAssistantMenuItemFactory.create().group(items[i], content)); addItem(HomeAssistantMenuItemFactory.create().tap(
name,
entity,
content,
action,
data,
{
:exit => false,
:confirm => confirm,
:pin => pin
}
));
} else if (type.equals("group")) {
addItem(HomeAssistantMenuItemFactory.create().group(items[i], content));
}
} }
} }
} }
@@ -192,11 +209,9 @@ class HomeAssistantView extends WatchUi.Menu2 {
} }
fullList.addAll(item.getMenuView().getItemsToUpdate()); fullList.addAll(item.getMenuView().getItemsToUpdate());
} else if (item instanceof HomeAssistantNumericMenuItem) { } else if (item instanceof HomeAssistantNumericMenuItem) {
// Numeric items can have an optional template to evaluate // Numeric items can have an optional template to evaluate, but they must always be included in order
var nmi = item as HomeAssistantNumericMenuItem; // to initialise the numeric picker's value.
if (nmi.hasTemplate()) { fullList.add(item);
fullList.add(item);
}
} else if (item instanceof HomeAssistantToggleMenuItem) { } else if (item instanceof HomeAssistantToggleMenuItem) {
fullList.add(item); fullList.add(item);
} else if (item instanceof HomeAssistantTapMenuItem) { } else if (item instanceof HomeAssistantTapMenuItem) {
+1
View File
@@ -59,6 +59,7 @@ class WebhookManager {
// System.println("WebhookManager onReturnRequestWebhookId() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?"); // System.println("WebhookManager onReturnRequestWebhookId() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?");
// Ignore and see if we can carry on // Ignore and see if we can carry on
break; break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE: case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
// System.println("WebhookManager onReturnRequestWebhookId() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned."); // System.println("WebhookManager onReturnRequestWebhookId() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
Settings.unsetIsSensorsEnabled(); Settings.unsetIsSensorsEnabled();