Compare commits

..

119 Commits
v3.1 ... v3.8

Author SHA1 Message Date
Philip Abbey
065a0e47cf Update manifest.xml
Indentation confusion resolved. Whitespace changes only.
2025-11-12 11:22:53 +00:00
Philip Abbey
f24d95d739 320 add icon for numeric menu item type (#321)
All icons are now automatically scales by Pythono scripts.
2025-11-12 11:17:35 +00:00
Philip Abbey
0d6c3a10c6 Changed icons SVG
Changed the way colours were managed in the SVG files to make them more amenable to scripting. Changed the scripts to automate icon resizing.

Co-Authored-By: Joseph Abbey <me@josephabbey.dev>
2025-11-11 19:57:51 +00:00
Philip Abbey
38d9c2c06d Icons with lighter blue 2025-11-10 20:41:48 +00:00
Philip Abbey
1bdc117c13 Amended all icons 2025-11-09 23:03:29 +00:00
Philip Abbey
87499dba50 Amended error icon size 48 2025-11-09 22:57:46 +00:00
Philip Abbey
193f53bbf0 Update manifest.xml
Reverted this file, which should not have been committed.
2025-11-09 19:13:05 +00:00
Philip Abbey
024b2c727f Changed icons
New dual colour icons and a numeric menu item icon.
2025-11-09 19:10:31 +00:00
Joseph Abbey
75045b19d9 Fix for numeric menu items over Wi-Fi/LTE (#318)
Turns out the sync service will not run unless the picker has not only
been popped but the display also updated.

v3.7 needs a swift turnaround as its a bug reported by a user.
2025-11-07 23:23:42 +00:00
Philip Abbey
d6e32b777f Update HISTORY.md
Added v3.7 text.
2025-11-07 09:10:47 +00:00
Philip Abbey
1e17d93310 Fix for numeric menu items over Wi-Fi/LTE
Turns out the sync service will not run unless the picker has not only been popped but the display also updated.
2025-11-07 09:05:22 +00:00
Philip Abbey
cc53b25508 Update HomeAssistantTapMenuItem.mc
Code tidy only.
2025-11-07 09:03:05 +00:00
Philip Abbey
098dc81236 Space alignment in code (tidy) and v3.6 history amendment 2025-11-06 20:40:43 +00:00
Philip Abbey
5ab8229602 Update Numeric.md
Changed 'service' to 'action'. Careless omission for new documentation.

Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2025-11-06 18:15:09 +00:00
Philip Abbey
8acc450c2c Update HISTORY.md
Amended v3.6 description.
2025-11-04 21:22:48 +00:00
Philip Abbey
1a52a942fd Added two screenshots for the Number Picker to Numeric.md (#316)
Amendment to documentation. Overlaps with changes a couple of changes on
#308 due to order.
2025-11-04 20:50:51 +00:00
Philip Abbey
d8b82f23e4 Merge branch 'main' into 315-add-screenshots-to-numericmd
Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2025-11-04 20:50:24 +00:00
Philip Abbey
4943c87edb Icon script changes (#314)
A partial update that does not include managing the white variants of
the icons.
2025-11-04 20:49:22 +00:00
Philip Abbey
179c4d1bc5 Rename service to action (#308) 2025-11-04 20:48:58 +00:00
Joseph Abbey
6822cbe434 Allow floats for media_player picker limits 2025-11-04 19:09:45 +00:00
Joseph Abbey
fbeadf7ba9 Merge branch 'main' into rename-service-to-action 2025-11-04 19:02:19 +00:00
Joseph Abbey
b688cec8f6 Use minimum and maximum instead of const 2025-11-04 19:00:22 +00:00
Philip Abbey
4119665817 Added two screenshots for the Number Picker to Numeric.md 2025-11-02 23:15:59 +00:00
Philip Abbey
f0e263ae54 Update config.schema.json
Amended "Home Assistant Template" description.
2025-11-02 22:38:19 +00:00
Philip Abbey
abd6552916 Documentation changes
"Home Assistant" => "HomeAssistant" search & replace
Added schema change for "exit" feature.
Added initial Devices.md
2025-11-02 19:36:33 +00:00
Philip Abbey
60f754f3e3 Update HomeAssistantMenuItemFactory.mc
Reverting picker => data change, as I think the original was correct, compiled and functionally worked.
2025-11-02 17:41:21 +00:00
Joseph Abbey
bc5a7d04e4 Schema fixes and move "exit" into "tap_action" 2025-11-02 13:14:48 +00:00
Philip Abbey
643c4aa2e5 Icon script changes
A partial update that does not include managing the white variants of the icons,
2025-11-02 13:14:31 +00:00
Philip Abbey
8360a3e4a2 Documentation update
Mainly for the HTTP 410 error case.
2025-11-02 12:20:46 +00:00
Joseph Abbey
ad83988ade Merge branch 'main' into rename-service-to-action
Signed-off-by: Joseph Abbey <me@josephabbey.dev>
2025-11-01 21:23:08 +00:00
Joseph Abbey
cac94fecd4 rename service to action 2025-11-01 21:19:10 +00:00
Philip Abbey
f9253e8cf0 Json schema update (#310) 2025-11-01 19:05:11 +00:00
Philip Abbey
3528080ec3 Merge branch 'main' into json-schema-update 2025-11-01 19:03:34 +00:00
Philip Abbey
cc321899f4 Initial code for user supplied confirmation messages (#307)
Hopefully a simple change to the code. This is on top of #306.
2025-11-01 19:02:56 +00:00
Philip Abbey
5a44765ac9 305 code tidy documentation for v36 (#306)
1. Amended `Lang.Dictionary` handling so more of them use the
`dict["key"] = value` format.
2. Added documentation for the `numeric` menu type.
2025-11-01 19:02:25 +00:00
Philip Abbey
9eb791c68b Update Numeric.md
Review comments.
2025-11-01 18:57:13 +00:00
Joseph Abbey
2fca0ef3a3 Update schema for picker object 2025-11-01 18:26:24 +00:00
Philip Abbey
fc0320aef6 Initial code for user supplied confirmation messages 2025-10-30 17:50:04 +00:00
Philip Abbey
0d3c76ef2e Update config.schema.json
Made the 'picker' field within 'tap_action' mandatory for a 'numeric' menu items.
2025-10-30 17:03:21 +00:00
Philip Abbey
4c946d584a Update HISTORY.md 2025-10-30 16:36:06 +00:00
Philip Abbey
6e3cf73ab3 Update manifest.xml
Reverted the application ID to one of the project's.
2025-10-30 11:50:56 +00:00
Philip Abbey
14186b7992 Documentation & source tidy for Lang.Dictionary items. 2025-10-30 11:39:19 +00:00
Philip Abbey
f64bed5058 Add light effect selector example to Select.md (#301)
Added an example of a light effect selector in JSON format.
2025-10-30 09:03:58 +00:00
Philip Abbey
619671de5d Moved the contents of Select.md to Actions.md
Feels like we already have a home for the example without creating a separate new file.
2025-10-30 09:02:40 +00:00
Philip Abbey
6d18406880 Select schema version in web (#300)
To test the schema on a specific version:
```url
https://house-of-abbey.github.io/web/?version=v1.4
```
To test the schema on a specific branch:
```url
https://house-of-abbey.github.io/web/?branch=numeric-item-json-schema
```
To test the schema on an arbitrary URL (may be affected by cors):
```url
https://house-of-abbey.github.io/web/?schema={url}
```
2025-10-30 08:57:04 +00:00
Philip Abbey
3a7676f4bf Add Numeric Menu Item (#298)
Added a new numeric menu item to set numeric values e.g. for heating,
volume, dimmer etc.
2025-10-29 20:11:31 +00:00
thmichel
f19eb7c276 Fixed compiler warning for unreachable code 2025-10-29 19:18:06 +01:00
thmichel
c617d2cad6 Merge pull request #4 from house-of-abbey/Picker-formatter
Suggested code changes from philipabbey
2025-10-29 18:33:54 +01:00
Philip Abbey
d1f6f6d9d2 Deduped picker variable 2025-10-29 15:14:30 +00:00
Philip Abbey
35333f4d75 Merge branch 'pr/298' into Picker-formatter 2025-10-29 15:13:13 +00:00
Philip Abbey
a5ddb65512 Suggested code changes from philipabbey
1. attribute is option, so needs a different template in the API call when absent.
2. Automatically derive the format string from the picker step value for any precision of step.
3. Changed all Lang.String representations of numbers to Lang.Number or Lang.Float. I'm keen to remove the use of strings to hold a numeric value.
4. Tidied up and completed some code comments.
5. Adjusted the JSON schema definition. This is still not finished as the 'picker' object is required for 'numeric' menu items and must not be present for the others. Additional schema changes are required for greater precision.
6. Moved fields over from 'data' to 'picker'.
2025-10-29 14:26:02 +00:00
thmichel
b0fa10b2c1 Fixed typo in formatsgtring and error if numeric template didn't return a value 2025-10-29 14:41:32 +01:00
thmichel
6a0ec34cdb Using a picker object to configure the picker now, deriving display format from steps. 2025-10-29 13:54:14 +01:00
thmichel
2cd171637c Reworked numericMenuItem to be able to display a different conten in the sublabel than jus a number. 2025-10-25 21:26:44 +02:00
thmichel
264b160fdf Merge pull request #3 from house-of-abbey/numeric-item-json-schema
Update schema to support numeric items
2025-10-23 12:10:20 +02:00
Joseph Abbey
81fa876449 Add light effect selector example to Select.md
Added an example of a light effect selector in JSON format.

Signed-off-by: Joseph Abbey <me@josephabbey.dev>
2025-10-22 14:37:41 +01:00
Joseph Abbey
b563ab7923 Arbitrary schema URL 2025-10-22 09:08:24 +01:00
Joseph Abbey
2ebf36a445 Select schema version in web 2025-10-22 09:05:09 +01:00
Joseph Abbey
5bdab41d8b Fix examples lists 2025-10-21 19:10:35 +01:00
Joseph Abbey
85080f5d46 2025-10-21 10:07:43 +01:00
Joseph Abbey
35e0fe26d0 Amendments 2025-10-21 09:05:15 +01:00
Joseph Abbey
427c1834a8 2025-10-21 09:03:49 +01:00
Joseph Abbey
4fbe4135b1 Update schema to support numeric items 2025-10-19 21:23:34 +01:00
thmichel
edef4ef464 Merge branch 'main' into main
Signed-off-by: thmichel <thomas.michel@vermessung-michel.de>
2025-10-19 16:56:09 +02:00
Philip Abbey
92e4278332 Update device reference link in manifest.xml
Signed-off-by: Philip Abbey <philipabbey@users.noreply.github.com>
2025-10-18 17:28:18 +01:00
thmichel
4348c899ae Fixed crash when value was int instead of float 2025-10-16 13:34:39 +02:00
thmichel
b34291e41f Code Cleanup 2025-10-13 15:57:00 +02:00
thmichel
7453b40cb1 Corrected settings 2025-10-13 15:53:55 +02:00
thmichel
483603a44d Updated products 2025-10-13 15:40:49 +02:00
thmichel
bc3271ba63 Merge pull request #2 from thmichel/Picker
Picker
2025-10-13 15:31:13 +02:00
thmichel
5ccd1be4e7 Merge branch 'main' into Picker
Signed-off-by: thmichel <thomas.michel@vermessung-michel.de>
2025-10-13 15:30:49 +02:00
thmichel
7871334b4a Updated Readme and Mianifest 2025-10-13 13:20:50 +02:00
thmichel
2f3ee236e8 Removed credentials from settings 2025-10-11 22:30:55 +02:00
thmichel
6609fed35d REmoved credentials from settings 2025-10-11 22:28:50 +02:00
thmichel
d68aecd19c Merge pull request #1 from thmichel:Picker
Picker
2025-10-11 22:01:51 +02:00
thmichel
9a61c9ce77 Code cleanup 2025-10-11 22:00:43 +02:00
thmichel
2981893af7 Using a Picker to set new value 2025-10-11 21:51:50 +02:00
thmichel
52e2efddd8 Added numeric Menu Item 2025-10-10 11:46:20 +02:00
Philip Abbey
cb382d820f Removed files marked as unintended for committing. 2025-10-01 17:54:35 +01:00
Philip Abbey
236b09d7f6 293 add support for new devices (#295)
Device update. Note dodgy Edge 850 device.
2025-10-01 17:47:21 +01:00
Philip Abbey
06e7c89b60 Amended documentation for Edge devices 2025-09-30 16:58:34 +01:00
Philip Abbey
6fc6be2eef Update HomeAssistantApp.mc
Removed debug print statements.
2025-09-30 16:53:04 +01:00
Philip Abbey
ac97a8af0d New devices and SDK demanded code updates
The SDK upgrade called for more careful specification of "or Null" on some fields in classes. The new devices have been added with their resource needs. Need to check if there's an issue with Edge 850 device.
2025-09-29 21:00:13 +01:00
Philip Abbey
28dc5a163c Internationalisation tidy up
Amended script and application history.
2025-09-14 14:13:57 +01:00
JosephAbbey
72b96c8f4d Apply automatic changes 2025-09-14 11:48:48 +00:00
__JosephAbbey
8956c0afb6 Update GitHub Action for translation with new script (#290) 2025-09-14 12:44:10 +01:00
Joseph Abbey
c1d4045890 Update pip install and env 2025-09-14 12:40:22 +01:00
Joseph Abbey
1dc2117eb2 Update the translation script to use Gemini instead of Google Translate (#287) 2025-09-14 12:35:01 +01:00
Philip Abbey
2729182420 Fix HomeAssistant in strings (#288) 2025-09-14 12:20:43 +01:00
Philip Abbey
9852ae39c3 Update HTTP_Headers.md
Missed some normalisation of 'HomeAssistant'.
2025-09-14 12:13:44 +01:00
Philip Abbey
acdd44564b 2025 09 bug fixes (#285)
Three bug fixes.

1. Fixed a bug where templates failed to display in toggle menu items
(at least on some devices).
2. 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. Closes #283.
3. 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. Closes #284.
2025-09-13 20:09:26 +01:00
Philip Abbey
8db9820ffa Cosmetic change to docs
"Home Assistant" -> "HomeAssistant"
2025-09-13 20:06:10 +01:00
Philip Abbey
ddc66baccb Re-translation of the HomeAssistant strings
I note that automatic translation has had some fun with the conversion of 'HomeAssistant', and not always desirable.
2025-09-13 20:02:06 +01:00
krzys-h
61afdc0566 Improve all existing translations
Using the newly introduced improve mode of translation script
2025-09-13 20:50:19 +02:00
krzys-h
e50d365e65 Add an option to limit the processed languages 2025-09-13 20:50:19 +02:00
krzys-h
d1f5abfc1f Implement improve mode
In improve mode, the AI is allowed to change any translation to correct
mistakes of the old Google Translate code.
2025-09-13 20:50:19 +02:00
krzys-h
0dd8bd72ff Update the translation script to use Gemini instead of Google Translate
This code itself was also AI generated.
2025-09-13 20:50:14 +02:00
__JosephAbbey
b2f1025a18 Fix HomeAssistant in strings 2025-09-13 19:28:48 +01:00
Philip Abbey
3566920114 Documentation update
New settings.
2025-09-13 12:05:49 +01:00
Philip Abbey
7ba0d76bf6 Added option to turn off automatic menu update checking
This is because it uses additional memory than can cause some older devices to crash unless they have smaller menus.
2025-09-13 11:06:29 +01:00
Philip Abbey
e284cd2d4a 2 Bug fixes
1. Fixed a bug where templates failed to display in toggle menu items (at least on some devices).
2. 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.
2025-09-12 14:34:16 +01:00
Philip Abbey
46e44ada30 Update README.md
Added link to Github issues.
2025-09-08 21:43:05 +01:00
Philip Abbey
960a069d99 Fixes (#282)
Fixes
2025-09-07 16:56:37 +01:00
Philip Abbey
c78ca4c318 Fixes 2025-09-07 14:43:18 +01:00
__JosephAbbey
0d28543156 278 add stale while revalidate to caching (#280)
Afetr startup and setting the meni item states, check to see if the
cache menu is out of date wrt the URL and then save the new version and
prompt the user to restart the application on the device. Initial
testing of the Beta version on my watch looks good.
2025-09-06 16:13:56 +01:00
__JosephAbbey
6e735ccd30 Handle null items and values, handle arrays directly under arrays 2025-09-06 16:12:43 +01:00
Philip Abbey
d534c60998 Update HISTORY.md
Added 3.3 version string.
2025-09-05 18:16:41 +01:00
Philip Abbey
4b206f4501 Update README.md
Amended for new cache validation code.
2025-09-05 16:40:57 +01:00
Philip Abbey
03ff4b570b Initial version 2025-09-05 15:43:01 +01:00
Philip Abbey
27dc66d005 Update HomeAssistantApp.mc
Cosmetic
2025-09-05 10:36:35 +01:00
Philip Abbey
9dbae5a64a Cosmetic
Code tidy
2025-09-05 10:01:24 +01:00
Philip Abbey
2923c8faec Documentation update for v3.2 2025-08-15 17:54:19 +01:00
Philip Abbey
a37b9842cb Update HISTORY.md
Amended v3.1 text. Added v3.2 text.
2025-08-15 17:26:32 +01:00
__JosephAbbey
ec2324a8d1 Only re-register sensors if the state has changed (#275) 2025-08-15 17:15:02 +01:00
Philip Abbey
7d77a79ad8 Fix for update before Webhook ID (re-)created. 2025-08-15 17:04:54 +01:00
Philip Abbey
756647d156 Added Setting option to clear the Webhook ID
Co-Authored-By: __JosephAbbey <me@josephabbey.dev>
2025-08-15 15:23:30 +01:00
Joseph Abbey
25cbcfe59a Rename variable 2025-08-15 13:56:46 +01:00
Philip Abbey
04dec1a8ba Merge branch 'main' into 273-only-reregister-sensors-if-the-setting-has-been-updated 2025-08-15 13:41:37 +01:00
Joseph Abbey
474bd552ad Only re-register sensors if the state has changed 2025-08-15 13:22:29 +01:00
192 changed files with 6551 additions and 2351 deletions

View File

@@ -23,11 +23,11 @@ jobs:
uses: actions/setup-python@v4.7.1
- run: |
pip install beautifulsoup4
pip install deep-translator
pip install lxml
pip install google-genai beautifulsoup4 lxml
- run: python translate.py
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
# Commit all changed files back to the repository
- uses: stefanzweifel/git-auto-commit-action@v5

2
.gitignore vendored
View File

@@ -5,3 +5,5 @@ settings.txt
Thumbs.db
# This file contain credentials, instead provide the empty file ClientId.mc.unpopulated
source/ClientId.mc
# Gemini API key for automated translations
gemini_api_key.txt

8
.vscode/launch.json vendored
View File

@@ -4,14 +4,6 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true
},
{
"type": "monkeyc",
"request": "launch",

View File

@@ -1,8 +1,8 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# Background Service
The background service can report the following statuses from your device to your Home Assistant:
The background service can report the following statuses from your device to your HomeAssistant:
- Battery Level with charging status.
- Location and location accuracy.
@@ -12,13 +12,13 @@ If your device does not support the background service, the application will cle
## Limits
The values are merely samples of your device's current status. They are sent by a single background service at the repetition frequency you chose in the settings. The samples are sent at that one rate only, they _do not vary_ for example on in activity, on charge, time of day. You get one refresh interval and that is it. If you want to change the refresh interval, you change your settings. We do appreciate that may not be what you would ideally like to trigger actions on Home Assistant. Messing with the repeat interval of the background service requires more code, more settings and more complexity. That means older devices using widgets would have to be taken out of support to achieve it.
The values are merely samples of your device's current status. They are sent by a single background service at the repetition frequency you chose in the settings. The samples are sent at that one rate only, they _do not vary_ for example on in activity, on charge, time of day. You get one refresh interval and that is it. If you want to change the refresh interval, you change your settings. We do appreciate that may not be what you would ideally like to trigger actions on HomeAssistant. Messing with the repeat interval of the background service requires more code, more settings and more complexity. That means older devices using widgets would have to be taken out of support to achieve it.
**Please do not ask for these to be made 'events'.** Garmin's [Connect IQ background service](https://developer.garmin.com/connect-iq/api-docs/Toybox/System/ServiceDelegate.html) is limited in that while it does provide an `onActivityCompleted()` method, it does not provide an `onActivityStarted()` method, so you would not have the complete activity life cycle anyway. So we're keeping this implementation simple, you just get a sampling at one refresh rate. This probably limits you to updating a status on a Home Assistant Dashboard only.
**Please do not ask for these to be made 'events'.** Garmin's [Connect IQ background service](https://developer.garmin.com/connect-iq/api-docs/Toybox/System/ServiceDelegate.html) is limited in that while it does provide an `onActivityCompleted()` method, it does not provide an `onActivityStarted()` method, so you would not have the complete activity life cycle anyway. So we're keeping this implementation simple, you just get a sampling at one refresh rate. This probably limits you to updating a status on a HomeAssistant Dashboard only.
## Battery Reporting
From version 2.1 the application includes a background service to report the current device battery level and charging status back to Home Assistant. This is a feature that Garmin omitted to include with the Bluetooth connection.
From version 2.1 the application includes a background service to report the current device battery level and charging status back to HomeAssistant. This is a feature that Garmin omitted to include with the Bluetooth connection.
## Location Reporting
@@ -47,7 +47,7 @@ From version 2.6 the application includes reporting your activity. The activity
- Activity - This is an integer as defined by [Toybox.Activity `SPORT`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Activity.html#Sport-module)
- Sub-activity - This is an integer as defined by [Toybox.Activity `SUB_SPORT`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Activity.html#SubSport-module)
The application only provides the integers without translation. When using the values in Home Assistant, you will need to provide you own mapping from the `Activity` enumerated type to the human readable text. As developers of the application we are pushing this translation to the server to keep the Garmin application code 'lean'. You will also need to add to both the list of activities (sports) and sub-activities (sub-sports) an interpretation of integer `-1` for no activity/sub-activity at present.
The application only provides the integers without translation. When using the values in HomeAssistant, you will need to provide you own mapping from the `Activity` enumerated type to the human readable text. As developers of the application we are pushing this translation to the server to keep the Garmin application code 'lean'. You will also need to add to both the list of activities (sports) and sub-activities (sub-sports) an interpretation of integer `-1` for no activity/sub-activity at present.
## Start Reporting
@@ -55,7 +55,7 @@ The main drawback of this solution is that the Garmin application must be run on
It should be as simple as starting the application (or widget). There should be a new device in the mobile app integration called `Garmin Watch` with the battery level and charging status.
[![Open your Home Assistant instance and show an integration.](https://my.home-assistant.io/badges/integration.svg)](https://my.home-assistant.io/redirect/integration/?domain=mobile_app)
[![Open your HomeAssistant instance and show an integration.](https://my.home-assistant.io/badges/integration.svg)](https://my.home-assistant.io/redirect/integration/?domain=mobile_app)
If this is not the case, head over to the [troubleshooting page](Troubleshooting.md#watch-battery-level-reporting).
@@ -67,7 +67,7 @@ To stop the reporting, the option must be turned off in the settings and then th
When the device is first created, it will be called `Garmin Watch`. This can be changed in the mobile app integration settings (button below).
[![Open your Home Assistant instance and show an integration.](https://my.home-assistant.io/badges/integration.svg)](https://my.home-assistant.io/redirect/integration/?domain=mobile_app)
[![Open your HomeAssistant instance and show an integration.](https://my.home-assistant.io/badges/integration.svg)](https://my.home-assistant.io/redirect/integration/?domain=mobile_app)
Select the device called `Garmin Watch` and then click on the edit icon in the top right corner. You can then change the name of the device to whatever you like, then press `UPDATE` and then `RENAME`.
@@ -91,7 +91,7 @@ template:
icon: "mdi:battery{% if is_state('binary_sensor.<device>_battery_is_charging', 'on') %}-charging{% endif %}{% if 0 < (states('sensor.<device>_battery_level') | float / 10 ) | round(0) * 10 < 100 %}-{{ (states('sensor.<device>_battery_level') | float / 10 ) | round(0) * 10 }}{% else %}{% if (states('sensor.<device>_battery_level') | float / 10 ) | round(0) * 10 == 0 %}-outline{% else %}{% if is_state('binary_sensor.<device>_battery_is_charging', 'on') %}-100{% endif %}{% endif %}{% endif %}"
```
## Adding a sample Home Assistant UI widget
## Adding a sample HomeAssistant UI widget
A gauge for battery level with a charging icon making use of [mushroom cards](https://github.com/piitaya/lovelace-mushroom), [card_mod](https://github.com/thomasloven/lovelace-card-mod) and [stack-in-card](https://github.com/custom-cards/stack-in-card):
@@ -161,7 +161,7 @@ N.B. `sensor.<device>_battery_level` will likely need to be changed to `sensor.<
## Migrating
You should remove your old template sensors before migrating to the new integration. You can do this by removing the `sensor.<device>_battery_level` and `binary_sensor.<device>_battery_is_charging` entities from `configuration.yaml` and then restarting Home Assistant or reloading the YAML.
You should remove your old template sensors before migrating to the new integration. You can do this by removing the `sensor.<device>_battery_level` and `binary_sensor.<device>_battery_is_charging` entities from `configuration.yaml` and then restarting HomeAssistant or reloading the YAML.
[Here is the old configuration method for reference.](https://github.com/house-of-abbey/GarminHomeAssistant/blob/b51e2aa2a4afbc58ad466f3b81667d1cd252d091/BatteryReporting.md)

194
Devices.md Normal file
View File

@@ -0,0 +1,194 @@
# Device Support & Characterisation
A page just to note a practical limit on support for some older devices.
## Application Memory Usage
On an `instinct2x` device:
| Version | Free Memory (bytes) on `instinct2x`| Free Memory (bytes) on `venu2`|
|:-------:|-----------------------------------:|------------------------------:|
| 3.5 | 62,360 | - |
| 3.6 | 65,696 | 53,832 |
A user has reported a maximum of 26 items with Ver 3.5. This measurement has shown that each menu item requires about 1.0~1.2 kB. Using the worked example below it is possible to predict how many menu items your particular device might be able to support by using indicative figures.
## Worked Example
As a worked example, for Ver 3.6 working on an `instinct2x` device:
| Feature | Memory (bytes) | Cost (bytes) |
|--------------------------------------|---------------:|-------------:|
| Declared available to application | 98,304 | |
| Measured available to application | 94,112 | (4,192 less) |
| Application used | 65,696 | |
| Free before fetching menu definition | 28,416 | |
| Free after fetching menu definition | 15,792 | 12,624 |
| Free after construction | 936 | 14,856 |
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.
## 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.
| Device | Supported | Application Memory |
|----------------------------|:---------:|--------------------:|
| d2bravo | N | 65,536 |
| d2bravo_titanium | N | 65,536 |
| fenix3 | N | 65,536 |
| fenix3_hr | N | 65,536 |
| fr230 | N | 65,536 |
| fr235 | N | 65,536 |
| fr630 | N | 65,536 |
| fr920xt | N | 65,536 |
| vivoactive | N | 65,536 |
| descentg1 | Y | 98,304 |
| instinct2 | Y | 98,304 |
| instinct2s | Y | 98,304 |
| instinct2x | Y | 98,304 |
| instinctcrossover | Y | 98,304 |
| approachs60 | N | 131,072 |
| enduro | Y | 131,072 |
| fenix5 | Y | 131,072 |
| fenix5s | Y | 131,072 |
| fenix6 | Y | 131,072 |
| fenix6s | Y | 131,072 |
| fenixchronos | Y | 131,072 |
| fr245 | Y | 131,072 |
| fr55 | Y | 131,072 |
| fr645 | Y | 131,072 |
| fr735xt | N | 131,072 |
| fr935 | Y | 131,072 |
| instinct3solar45mm | Y | 131,072 |
| instincte40mm | Y | 131,072 |
| instincte45mm | Y | 131,072 |
| venusq | Y | 131,072 |
| vivoactive3 | Y | 131,072 |
| vivoactive3d | N | 131,072 |
| vivoactive_hr | N | 131,072 |
| edge_520 | N | 262,144 |
| fr255 | Y | 524,288 |
| fr255s | Y | 524,288 |
| approachs50 | Y | 786,432 |
| approachs7042mm | Y | 786,432 |
| approachs7047mm | Y | 786,432 |
| d2airx10 | Y | 786,432 |
| d2mach1 | Y | 786,432 |
| descentg2 | Y | 786,432 |
| descentmk343mm | Y | 786,432 |
| descentmk351mm | Y | 786,432 |
| enduro3 | Y | 786,432 |
| epix2 | Y | 786,432 |
| epix2pro42mm | Y | 786,432 |
| epix2pro47mm | Y | 786,432 |
| epix2pro47mmsystem7preview | Y | 786,432 |
| epix2pro51mm | Y | 786,432 |
| fenix7 | Y | 786,432 |
| fenix7pro | Y | 786,432 |
| fenix7pronowifi | Y | 786,432 |
| fenix7s | Y | 786,432 |
| fenix7spro | Y | 786,432 |
| fenix7x | Y | 786,432 |
| fenix7xpro | Y | 786,432 |
| fenix7xpronowifi | Y | 786,432 |
| fenix843mm | Y | 786,432 |
| fenix847mm | Y | 786,432 |
| fenix8pro47mm | Y | 786,432 |
| fenix8solar47mm | Y | 786,432 |
| fenix8solar51mm | Y | 786,432 |
| fenixe | Y | 786,432 |
| fr165 | Y | 786,432 |
| fr165m | Y | 786,432 |
| fr255m | Y | 786,432 |
| fr255sm | Y | 786,432 |
| fr265 | Y | 786,432 |
| fr265s | Y | 786,432 |
| fr57042mm | Y | 786,432 |
| fr57047mm | Y | 786,432 |
| fr955 | Y | 786,432 |
| fr965 | Y | 786,432 |
| fr970 | Y | 786,432 |
| instinct3amoled45mm | Y | 786,432 |
| instinct3amoled50mm | Y | 786,432 |
| instinctcrossoveramoled | Y | 786,432 |
| marq2 | Y | 786,432 |
| marq2aviator | Y | 786,432 |
| system8preview | N | 786,432 |
| venu2 | Y | 786,432 |
| venu2plus | Y | 786,432 |
| venu2s | Y | 786,432 |
| venu3 | Y | 786,432 |
| venu3s | Y | 786,432 |
| venu441mm | Y | 786,432 |
| venu445mm | Y | 786,432 |
| venusq2 | Y | 786,432 |
| venusq2m | Y | 786,432 |
| venux1 | Y | 786,432 |
| vivoactive5 | Y | 786,432 |
| vivoactive6 | Y | 786,432 |
| approachs62 | N | 1,048,576 |
| d2air | Y | 1,048,576 |
| edge1030 | Y | 1,048,576 |
| edge1030bontrager | Y | 1,048,576 |
| edge1030plus | Y | 1,048,576 |
| edge1040 | Y | 1,048,576 |
| edge1050 | Y | 1,048,576 |
| edge520plus | Y | 1,048,576 |
| edge530 | Y | 1,048,576 |
| edge540 | Y | 1,048,576 |
| edge550 | Y | 1,048,576 |
| edge820 | Y | 1,048,576 |
| edge830 | Y | 1,048,576 |
| edge840 | Y | 1,048,576 |
| edge850 | Y | 1,048,576 |
| edgeexplore | Y | 1,048,576 |
| edgeexplore2 | Y | 1,048,576 |
| edgemtb | Y | 1,048,576 |
| edge_1000 | N | 1,048,576 |
| epix | N | 1,048,576 |
| fr645m | Y | 1,048,576 |
| legacyherocaptainmarvel | Y | 1,048,576 |
| legacyherofirstavenger | Y | 1,048,576 |
| legacysagadarthvader | Y | 1,048,576 |
| legacysagarey | Y | 1,048,576 |
| venu | Y | 1,048,576 |
| venud | Y | 1,048,576 |
| venusqm | Y | 1,048,576 |
| vivoactive3m | Y | 1,048,576 |
| vivoactive3mlte | Y | 1,048,576 |
| vivoactive4 | Y | 1,048,576 |
| vivoactive4s | Y | 1,048,576 |
| d2charlie | N | 1,310,720 |
| d2delta | Y | 1,310,720 |
| d2deltapx | Y | 1,310,720 |
| d2deltas | Y | 1,310,720 |
| descentmk1 | N | 1,310,720 |
| descentmk2 | Y | 1,310,720 |
| descentmk2s | Y | 1,310,720 |
| fenix5plus | Y | 1,310,720 |
| fenix5splus | Y | 1,310,720 |
| fenix5x | Y | 1,310,720 |
| fenix5xplus | Y | 1,310,720 |
| fenix6pro | Y | 1,310,720 |
| fenix6spro | Y | 1,310,720 |
| fenix6xpro | Y | 1,310,720 |
| fr245m | Y | 1,310,720 |
| fr745 | Y | 1,310,720 |
| fr945 | Y | 1,310,720 |
| fr945lte | Y | 1,310,720 |
| marqadventurer | Y | 1,310,720 |
| marqathlete | Y | 1,310,720 |
| marqaviator | Y | 1,310,720 |
| marqcaptain | Y | 1,310,720 |
| marqcommander | Y | 1,310,720 |
| marqdriver | Y | 1,310,720 |
| marqexpedition | Y | 1,310,720 |
| marqgolfer | Y | 1,310,720 |
| gpsmap66 | Y | 2,359,296 |
| gpsmap67 | Y | 2,359,296 |
| gpsmap86 | N | 2,359,296 |
| gpsmaph1 | Y | 2,359,296 |
| montana7xx | Y | 2,359,296 |
| oregon7xx | N | 2,359,296 |
| rino7xx | N | 2,359,296 |

View File

@@ -1,4 +1,4 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# Version History
@@ -9,14 +9,14 @@
| 1.2 | Do not crash on zero items to update. Report unreachable URLs. Verify API URL does not have a trailing slash '/'. Increased HTTP response diagnosis. Reduced minimum API Level required from 3.3.0 to 3.1.0 to allow more device "part numbers" to be satisfied. |
| 1.3 | Tap for scripts was working in emulation but not on some phones. Decision is to make the 'service' field in the JSON compulsory for 'tap' menu items. This is a breaking change, but for many might be a fix for something not working correctly. Improve language support, we can now accept language corrections and prevent the automated translation of strings from clobbering manually refined entries. Thank you to two new contributors. |
| 1.4 | New lean user Interface with thanks to [Someone0nEarth](https://github.com/Someone0nEarth) for their contribution which is now the default. If you prefer the old style you can still select it in the settings. The provision of a 'service' tag is now not just heavily suggested by the JSON schema, it is enforced in code. With apologies to anyone suffering a breakage as a result. |
| 1.5 | <img src="images/confirmation_view.png" width="200" title="Confirmation View"/><br/>Added an optional confirmation dialogue view to prevent accidental execution of actions on mistaken tap. This also brings a change in the JSON schema to allow an optional field to specify that the confirmation should be used for a menu item. As we are now maturing and adding features we have decided to mitigate breaking changes to the JSON schema by being more careful to adopt the Home Assistant schema (noting there is a 1:1 mapping between YAML and JSON). This change does deprecate the top level `service` tag in favour of `tag_action` containing multiple fields including `service` & `confirm`. Users should migrate to the new format for the new functionality, but the timescale for actual deprecation are long and undecided. |
| 1.5 | <img src="images/confirmation_view.png" width="200" title="Confirmation View"/><br/>Added an optional confirmation dialogue view to prevent accidental execution of actions on mistaken tap. This also brings a change in the JSON schema to allow an optional field to specify that the confirmation should be used for a menu item. As we are now maturing and adding features we have decided to mitigate breaking changes to the JSON schema by being more careful to adopt the HomeAssistant schema (noting there is a 1:1 mapping between YAML and JSON). This change does deprecate the top level `service` tag in favour of `tag_action` containing multiple fields including `service` & `confirm`. Users should migrate to the new format for the new functionality, but the timescale for actual deprecation are long and undecided. |
| 1.6 | Added a user configurable 'timeout' in seconds so that when no action is taken the application automatically closes, stopping the continuous polling for changes of status and hence saving the drain on the battery. This can be disabled with timeout=0. |
| 1.7 | Added timeout to confirmation views so that when used for security devices it does not linger when left unconfirmed. Thanks to [Jan Schneider](https://github.com/j-a-n) for the contribution. Known bug for devices not supporting [`WatchUi.getCurrentView()`](https://developer.garmin.com/connect-iq/api-docs/Toybox/WatchUi.html#getCurrentView-instance_function) API call which is only available on API Level 3.4.0, e.g. Vivoactive 4S. |
| 2.0 | A significant code base change to enable both a 'widget' version for older devices, e.g. Venu (1), and an application with a glance, e.g. Venu2. These two versions must now be distributed under separate application IDs, but they have the same code base. A further 20 more devices are now supported, the settings have been internationalised, and there's a bug fix for older devices when trying to display a helpful error message but instead the application crashed. This version has come from a significant collaboration with [Someone0nEarth](https://github.com/Someone0nEarth). |
| 2.1 | Deployment of an idea to provide Home Assistant with access to the watch battery level. Using this requires [significant setup](BackgroundService.md) on the Home Assistant configuration and hence is detailed separately. Due to this, the default state for this battery option is _off_. Changed the application settings user interface to be more intuitive, and hence amended the way settings are managed in the background. |
| 2.1 | Deployment of an idea to provide HomeAssistant with access to the watch battery level. Using this requires [significant setup](BackgroundService.md) on the HomeAssistant configuration and hence is detailed separately. Due to this, the default state for this battery option is _off_. Changed the application settings user interface to be more intuitive, and hence amended the way settings are managed in the background. |
| 2.2 | Adds a feature to cache the menu configuration and save the time taken for an HTTP request to fetch it. You as the user are responsible for managing the cache by clearing it when you update your configuration. Improvement to widget root display updates. Bug fix for battery level reporting when in the glance carousel. Fixed an uninternationalised string, "Execute". Unfixed issue with battery level updates when the user is not an administrator. |
| 2.3 | Fix for battery level updates where previously the function only worked for administrator accounts. The new solution is based on Webhooks and is simpler to implement on Home Assistant. Language support fix where an automatic translation produced an inappropriate word, possibly in more than one language. |
| 2.4 | Sensor status reporting via Home Assistant 'templates'. This provides a generalised way of viewing the status of any entity as long as the result can be rendered as text, e.g. 'uncovered', 'open', '76%', '21 °C'. Removal of the menu style option. The original style was kept after the introduction of the icon style solely to keep the code for a possible re-use for sensor statuses. This version delivers that new feature, hence the style option has been removed. The new JSON configuration file format allows for the old style to be replicated if you are desperate! Added a feature to provide parameters to actions (`tap` or `template`). Added a feature to confirm `toggle` menu items. |
| 2.3 | Fix for battery level updates where previously the function only worked for administrator accounts. The new solution is based on Webhooks and is simpler to implement on HomeAssistant. Language support fix where an automatic translation produced an inappropriate word, possibly in more than one language. |
| 2.4 | Sensor status reporting via HomeAssistant 'templates'. This provides a generalised way of viewing the status of any entity as long as the result can be rendered as text, e.g. 'uncovered', 'open', '76%', '21 °C'. Removal of the menu style option. The original style was kept after the introduction of the icon style solely to keep the code for a possible re-use for sensor statuses. This version delivers that new feature, hence the style option has been removed. The new JSON configuration file format allows for the old style to be replicated if you are desperate! Added a feature to provide parameters to actions (`tap` or `template`). Added a feature to confirm `toggle` menu items. |
| 2.5 | A small memory efficiency of about 1kB by removing `RezStrings.mc`. This will aid widgets on old watches that only have 60kB available to an application and are using about 45kB before the menu is fetched, hence 1kB is more significant to those devices. |
| 2.6 | Added more information reporting to the background service, in addition to the device battery level and charging status, we now include location, location accuracy, and (if supported by your device) the activity information. Note the updates are sent periodically and are not event driven. |
| 2.7 | Bug fix release: 1. Handling a settings change, 2. Avoid caching a bad menu, 3. Managing bad JSON in menu definitions. |
@@ -46,4 +46,11 @@
| 2.31 | Adding [two new options](./examples/Actions.md#exit-on-tap) to the menu items: 1) The ability to disable a menu item, e.g. temporarily for seasonal changes, 2) The option to exit after a menu item has been select. |
| 2.32 | Bug fix for a breaking change extracting options caused by the need to rearrange function parameters for an [annoying compiler error](https://github.com/house-of-abbey/GarminHomeAssistant/issues/253). |
| 3.0 | First version with the ability to use [Wi-Fi or LTE](Wi-Fi.md) instead of Bluetooth but with limited functionality, thanks to [@vincentezw](https://github.com/vincentezw). |
| 3.1 | Added the ability for users to provide custom HTTP headers for their Home Assistant server. Improved German language translations. Removed all groups in settings as the SDK is buggy. Fixed a bug with templates in glances causing application crash on startup. |
| 3.1 | Added the ability for users to provide [custom HTTP headers](HTTP_Headers.md) for their HomeAssistant server. Improved German language translations. Thanks to [@tispokes](https://github.com/tispokes) for assisting with both of those. Removed all groups in settings as the SDK is buggy. Fixed a bug with templates in glances causing application crash on startup. |
| 3.2 | Only enable or disable sensors on HomeAssistant when the background service options is changed, i.e. do not call the API to enable on start up every time. |
| 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.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.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. |

View File

@@ -1,8 +1,8 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# User Specified Custom HTTP Headers
Principally for those who use Home Assistant add-on [Cloudflared](https://github.com/brenner-tobias/addon-cloudflared) in order to provide additional security via Cloudflare's Web Application Firewall (WAF). But Garmin does not support certificates in requests. And the solution is generic enough for other use cases.
Principally for those who use HomeAssistant add-on [Cloudflared](https://github.com/brenner-tobias/addon-cloudflared) in order to provide additional security via Cloudflare's Web Application Firewall (WAF). But Garmin does not support certificates in requests. And the solution is generic enough for other use cases.
Please let us know if this solution is found to be useful for other situations.
@@ -24,7 +24,7 @@ Make the key strong enough!
**None!**
The authors of the Garmin Home Assistant application do not use, and hence do not know, the [Cloudflared](https://github.com/brenner-tobias/addon-cloudflared) add-on. While we have enabled the HTTP headers to support using this add-on, it does mean _you support yourself_. Please do not raise issues about this functionality unless you are supplying the answers for any required changes too!
The authors of the Garmin HomeAssistant application do not use, and hence do not know, the [Cloudflared](https://github.com/brenner-tobias/addon-cloudflared) add-on. While we have enabled the HTTP headers to support using this add-on, it does mean _you support yourself_. Please do not raise issues about this functionality unless you are supplying the answers for any required changes too!
## Credits
@@ -33,5 +33,5 @@ With thanks to Lars Pöpperl ([@tispokes](https://github.com/tispokes)) for cont
## References
* [Using Cloudflare ZeroTrust and mTLS to securely access Home Assistant via the internet](https://kcore.org/2024/06/28/using-cloudflare-zerotrust-and-mtls-with-home-assistant-via-the-internet/)
* [Home Assistant Add-on: Cloudflared](https://github.com/brenner-tobias/addon-cloudflared)
* [Using Cloudflare ZeroTrust and mTLS to securely access HomeAssistant via the internet](https://kcore.org/2024/06/28/using-cloudflare-zerotrust-and-mtls-with-home-assistant-via-the-internet/)
* [HomeAssistant Add-on: Cloudflared](https://github.com/brenner-tobias/addon-cloudflared)

207
README.md
View File

@@ -1,27 +1,27 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# GarminHomeAssistant
<img src="images/Actual_Venu2_Theme.jpg" width="200" title="Venu 2"/>
A Garmin application to provide a "dashboard" to control your devices via [Home Assistant](https://www.home-assistant.io/). The application will never be as fully fledged as a Home Assistant dashboard, so it is designed to be good enough for the simple and essential things. Those things that can be activated via an on/off toggle or a tap. That should cover lights, switches, and anything requiring a single press such as an automation. For anything more complicated, e.g. thermostat, it would always be quicker and simpler to reach for your phone or tablet... or the device's own remote control!
A Garmin application to provide a "dashboard" to control your devices via [HomeAssistant](https://www.home-assistant.io/). The application will never be as fully fledged as a HomeAssistant dashboard, so it is designed to be good enough for the simple and essential things. Those things that can be activated via an on/off toggle or a tap. That should cover lights, switches, and anything requiring a single press such as an automation. For anything more complicated, e.g. thermostat, it would always be quicker and simpler to reach for your phone or tablet... or the device's own remote control!
The application is designed around a simple scrollable menu where menu items have been extended to interface with the [Home Assistant API](https://developers.home-assistant.io/docs/api/rest/), e.g. to get the status of switches or lights for display on the `toggle` menu item, or a text status for an entity (`info` item). It is possible to nest menus, so there is a menu item to open a sub-menu. This can be arbitrarily deep and nested in the format of a tree of items, although you need to consider if reaching for your phone becomes quicker to select the device what you want to control.
The application is designed around a simple scrollable menu where menu items have been extended to interface with the [HomeAssistant API](https://developers.home-assistant.io/docs/api/rest/), e.g. to get the status of switches or lights for display on the `toggle` menu item, or a text status for an entity (`info` item). It is possible to nest menus, so there is a menu item to open a sub-menu. This can be arbitrarily deep and nested in the format of a tree of items, although you need to consider if reaching for your phone becomes quicker to select the device what you want to control.
**The intended audience for this application are those comfortable with configuring a Home Assistant** (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.
**If you are struggling with getting the application to work, please consult the [troubleshooting guide](TroubleShooting.md#menu-configuration-url) first.**
## No HTTPS?
> [!IMPORTANT]
> The Garmin SDK allows HTTP requests only to a limited number of domains specified in their app. Therefore, for your Garmin to communicate with your Home Assistant instance, your Home Assistant instance must be accessible via HTTPS (with a public certificate!) or through a local DNS server that overrides one of the whitelisted domains to communicate using HTTP.
> The Garmin SDK allows HTTP requests only to a limited number of domains specified in their app. Therefore, for your Garmin to communicate with your HomeAssistant instance, your HomeAssistant instance must be accessible via HTTPS (with a public certificate!) or through a local DNS server that overrides one of the whitelisted domains to communicate using HTTP.
>
>New with version 3.1, you can use [Cloudflared](https://github.com/brenner-tobias/addon-cloudflared) plug-in in combination with a [custom HTTP header](HTTP_Headers.md) and do not need a public certificate for HTTPS.
>
> To make your Home Assistant instance accessible via HTTPS, you will need a public certificate. You can get one for free from [Let's Encrypt](https://letsencrypt.org/) or you can pay for [Home Assistant cloud](https://www.nabucasa.com/). (You can install a local [Nginx proxy server](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_nginxproxymanager) to manage Let's Encrypt certificates.)
> To make your HomeAssistant instance accessible via HTTPS, you will need a public certificate. You can get one for free from [Let's Encrypt](https://letsencrypt.org/) or you can pay for [HomeAssistant cloud](https://www.nabucasa.com/). (You can install a local [Nginx proxy server](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_nginxproxymanager) to manage Let's Encrypt certificates.)
>
> If you use a local DNS server (like [Pi-Hole](https://pi-hole.net/)), you can create a local DNS record for the domain `garmincdn.com` (which is allowed for HTTP in the Garmin SDK) and map it to your Home Assistant instance's IP. "_[About Communication Between Garmin SDK and a Raspberry Pi](https://www.instructables.com/About-Communication-Between-Garmin-SDK-and-a-Raspb/)_" provides additional workarounds for HTTP request restrictions in the Garmin SDK.
> If you use a local DNS server (like [Pi-Hole](https://pi-hole.net/)), you can create a local DNS record for the domain `garmincdn.com` (which is allowed for HTTP in the Garmin SDK) and map it to your HomeAssistant instance's IP. "_[About Communication Between Garmin SDK and a Raspberry Pi](https://www.instructables.com/About-Communication-Between-Garmin-SDK-and-a-Raspb/)_" provides additional workarounds for HTTP request restrictions in the Garmin SDK.
>
> **No support is offered to those circumventing the HTTPS restriction of the Connect IQ SDK.** You are supporting yourself!
@@ -56,13 +56,13 @@ The following table lists the differences in functionality between the two. The
## Dashboard Definition
Setup for this menu is more complicated than the Connect IQ settings menu really allows you to specify. In order to make the dashboard easily configurable and easy to change, we have provided an external mechanism for specifying the menu layout, a JSON file you write, retrieved from a URL you specify. JSON was chosen over YAML because Garmin can parse JSON HTTP GET responses into its own internal dictionary, it cannot parse YAML, hence a choice of one really. Note that JSON and YAML are essentially a 1:1 format mapping except JSON does not have comments. We recommend you take advantage of [Home Assistant's own web server](https://www.home-assistant.io/integrations/http/#hosting-files) to provide the JSON definition. The advantages of this are:
Setup for this menu is more complicated than the Connect IQ settings menu really allows you to specify. In order to make the dashboard easily configurable and easy to change, we have provided an external mechanism for specifying the menu layout, a JSON file you write, retrieved from a URL you specify. JSON was chosen over YAML because Garmin can parse JSON HTTP GET responses into its own internal dictionary, it cannot parse YAML, hence a choice of one really. Note that JSON and YAML are essentially a 1:1 format mapping except JSON does not have comments. We recommend you take advantage of [HomeAssistant's own web server](https://www.home-assistant.io/integrations/http/#hosting-files) to provide the JSON definition. The advantages of this are:
1. the file is as public as you make your Home Assistant,
2. the file is editable within Home Assistant via "[Studio Code Server](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_vscode)", and
1. the file is as public as you make your HomeAssistant,
2. the file is editable within HomeAssistant via "[Studio Code Server](https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_vscode)", and
3. the schema is verifiable using [JSON Schema](https://json-schema.org/overview/what-is-jsonschema).
We have used `/config/www/garmin/<something>.json` on our home brew Home Assistant's file system. That equates to a URL of `https://homeassistant.local/local/garmin/<something>.json`.
We have used `/config/www/garmin/<something>.json` on our home brew HomeAssistant's file system. That equates to a URL of `https://homeassistant.local/local/garmin/<something>.json`.
> [!IMPORTANT]
> However [recent reports](https://community.home-assistant.io/t/www-folder-location-for-local-documents/24903/16) suggest this path may no longer work on [Nabu Casa](https://www.nabucasa.com/) and you should use `/homeassistant/www/` instead of `/config/www/`. We are unable to verify this since our free trial of Nabu Casa has expired.
@@ -81,7 +81,7 @@ Example schema:
"name": "Food is Ready!",
"type": "tap",
"tap_action": {
"service": "script.turn_on",
"action": "script.turn_on",
"confirm": true
}
},
@@ -132,7 +132,7 @@ Example schema:
"name": "Turn off USBs",
"type": "tap",
"tap_action": {
"service": "automation.trigger"
"action": "automation.trigger"
}
},
{
@@ -140,9 +140,25 @@ Example schema:
"name": "TV Lights Scene",
"type": "tap",
"tap_action": {
"service": "scene.turn_on",
"action": "scene.turn_on",
"pin": true
}
},
{
"name": "Heating",
"content": "{{ ' %.1f' | format(state_attr('climate.room','temperature')) }}",
"type": "numeric",
"entity": "climate.room",
"tap_action": {
"action": "climate.set_temperature",
"picker": {
"step": 0.5,
"start": 10,
"stop": 30,
"attribute": "temperature",
"data_attribute": "temperature"
}
}
}
]
}
@@ -155,34 +171,47 @@ The example above illustrates how to configure:
* Lights or switches (`toggle`), <img src="images/toggle_icon.png" height="20">
* Enables for automations (`toggle`), <img src="images/toggle_icon.png" height="20">
* Script invocation (`tap`)
* Service invocation, e.g. Scene setting, (`tap`)
* Action invocation, e.g. Scene setting, (`tap`)
* A sub-menu to open (`group`)
* A numeric item (`numeric`), which allows you to set a numeric value e.g. for heating or a dimmer. This is [explained more fully](examples/Numeric.md) in its own examples page.
* You can also display the status of devices (`info`) which is essentially a `tap` with no action
* All menu items can display the results of evaluating [templates](examples/Templates.md).
The following table indicates how Home Assistant entity types can map to the Garmin applications menu types. Presently, an automation is the only one that can be either a `tap` or a `toggle`.
The following table indicates how HomeAssistant entity types can map to the Garmin applications menu types. Presently, an automation is the only one that can be either a `tap` or a `toggle`.
| HA Entity Type | Tap | Toggle | Info (status)|
|------------------|:---:|:------:|:------------:|
| Switch | ❌ | ✅ | ✅ |
| Light | ❌ | ✅ | ✅ |
| Automation | ✅ | | |
| Script | ✅ | | |
| Scene | ✅ | ❌ | ❌ |
| Sensor | | ❌ | |
| Binary Sensor | ❌ | ❌ | ✅ |
| Any other entity | ❌ | ❌ | ✅ |
| Any service | | ❌ | |
| HA Entity Type | Tap | Toggle | Info (status)| Numeric |
|------------------|:---:|:------:|:------------:|:-------:|
| Switch | ❌ | ✅ | ✅ | ❌ |
| Switched Light | ❌ | ✅ | ✅ | ❌ |
| Dimmer Light | ❌ | ❌ | | |
| Automation | ✅ | ✅ | | |
| Script | ✅ | ❌ | ❌ | ❌ |
| Scene | | ❌ | | ❌ |
| Sensor | ❌ | ❌ | ✅ | ❌ |
| Binary Sensor | ❌ | ❌ | ✅ | ❌ |
| Thermostat | | ❌ | ✅ | |
| Amplifier | ❌ | ❌ | ✅ | ✅ |
| Any other entity | ❌ | ❌ | ✅ | ❌ |
| Any action | ✅ | ❌ | ❌ | ❌ |
Multiple templates are evaluated in a single HTTP request to update their status. Only the toggle items have the on/off <img src="images/toggle_icon.png" height="20"> icon. NB. All `tap` items must specify a `service` tag in the `tap_action` object (see example below).
Multiple templates are evaluated in a single HTTP request to update their status. Only the toggle items have the on/off <img src="images/toggle_icon.png" height="20"> icon. NB. All `tap` and `numeric` items must specify a `action` tag in the `tap_action` object (see example below).
You can now specify alternative texts to use instead of "On" and "Off", e.g. "Locked" and "Unlocked" or "Open" and "Closed" through the use of a [template menu item](examples/Templates.md). But wouldn't having locks operated from your watch be a security concern ;-) ?
The [schema](https://raw.githubusercontent.com/house-of-abbey/GarminHomeAssistant/main/config.schema.json) is checked by using a URL directly back to this GitHub source repository, so you do not need to install that file. You can just copy & paste your entity names from the YAML configuration files used to configure Home Assistant. With a submenu, there's a difference between `title` and `name`. The `name` goes on the menu item, and the `title` at the head of the submenu. If your dashboard definition fails to meet the schema, the application will simply drop items with the wrong field names without warning to protect itself.
The [schema](https://raw.githubusercontent.com/house-of-abbey/GarminHomeAssistant/main/config.schema.json) is checked by using a URL directly back to this GitHub source repository, so you do not need to install that file. You can just copy & paste your entity names from the YAML configuration files used to configure HomeAssistant. With a submenu, there's a difference between `title` and `name`. The `name` goes on the menu item, and the `title` at the head of the submenu. If your dashboard definition fails to meet the schema, the application will simply drop items with the wrong field names without warning to protect itself.
### Old deprecated format
### Old Deprecated Formats
Version 1.5 brought in a change to the JSON schema so the following old format remains useable but is no longer favoured. The schema now marks it as 'deprecated' to nudge people over.
There are two reasons for the changes to the schema:
1. HomeAssistant made changes we feel we should track for consistency.
2. Retrospectively we decided there was a better way, just like HomeAssistant did. For these changes we apologise.
#### Service Field
Version 1.5 brought in a change to the JSON schema so the following old format remains useable but is no longer favoured.
> [!IMPORTANT] Deprecated:
```json
{
@@ -193,7 +222,9 @@ Version 1.5 brought in a change to the JSON schema so the following old format r
}
```
The above should be replaced by the following:
Version 3.6 brought another change to the JSON schema to follow HomeAssistant's renaming of `service` to `action`.
> [!IMPORTANT] Deprecated:
```json
{
@@ -206,19 +237,67 @@ The above should be replaced by the following:
}
```
This allows the `confirm` and `pin` fields to be accommodated in the `tap_action` along side the `service` tag, and follows the Home Assistant YAML format more closely.
The above should be replaced by the following:
```json
{
"entity": "scene.tv_light",
"name": "TV Lights Scene",
"type": "tap",
"tap_action": {
"action": "scene.turn_on"
}
}
```
This allows the `confirm` and `pin` fields to be accommodated in the `tap_action` along side the `action` tag, and follows the HomeAssistant YAML format more closely.
#### Exit Field
Version 2.31 added an "exit on tap" feature. In retrospect this field should have been nested inside the `tap_action` object.
> [!IMPORTANT] Deprecated:
```json
{
"entity": "automation.turn_off_stuff",
"name": "Turn off Stuff",
"type": "tap",
"tap_action": {
"action": "automation.trigger"
},
"exit": true
}
```
The above should be replaced by the following:
```json
{
"entity": "automation.turn_off_stuff",
"name": "Turn off Stuff",
"type": "tap",
"tap_action": {
"action": "automation.trigger",
"exit": true
},
}
```
A future move to v3.x will remove support for all deprecated JSON elements to simplify code. **Please ensure you track the schema changes in readiness.**
### More Examples
* [Switches](examples/Switches.md)
* [Actions](examples/Actions.md)
* [Templates](examples/Templates.md)
* [Numeric](examples/Numeric.md)
## Editing the JSON file
You have options. The first is what we use.
1. **Best!** Use the GarminHomeAssistant [Web-based Editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) which includes `entity` and `service` name completion and validation by fetching data from your own Home Assistant instance. _Pretty nifty eh?_ The other method listed below do not add this convenience and checking.
2. Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for Home Assistant. You can then edit your JSON file in place.
1. **Best!** Use the GarminHomeAssistant [Web-based Editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) which includes `entity` and `action` name completion and validation by fetching data from your own HomeAssistant instance. _Pretty nifty eh?_ The other method listed below do not add this convenience and checking.
2. Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for HomeAssistant. You can then edit your JSON file in place.
3. Locally installed VSCode, or if not installed, try
4. The on-line version at https://vscode.dev/, which works really well.
@@ -232,7 +311,7 @@ Make sure you can browse to the URL of your JSON file in a standard web browser
## API Key Creation
Having created your JSON definition for your dashboard, you need to create an API key for your personal account on Home Assistant. You will need a [Long-Lived Access Token](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token). This is not obvious to find and is bound to your own Home Assistant account. Follow the menu sequence: `HA -> User Profile -> "Security" tab -> Long-lived access tokens`. Make sure you save the generated token before dismissing it.
Having created your JSON definition for your dashboard, you need to create an API key for your personal account on HomeAssistant. You will need a [Long-Lived Access Token](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token). This is not obvious to find and is bound to your own HomeAssistant account. Follow the menu sequence: `HA -> User Profile -> "Security" tab -> Long-lived access tokens`. Make sure you save the generated token before dismissing it.
![Long-Lived Access Token](images/Long_Lived_Access_Tokens.png)
@@ -240,7 +319,7 @@ Having created that token, before you dismiss the dialogue box with the value yo
## API URL
If you are using [Nabu Casa](https://www.nabucasa.com/) then your Cloud API URL can be found by looking up your URL via `HA -> Settings -> Home Assistant Cloud -> Remote Control -> Nabu Casa URL` and don't forget to add `/api` to the end of the copied string.
If you are using [Nabu Casa](https://www.nabucasa.com/) then your Cloud API URL can be found by looking up your URL via `HA -> Settings -> HomeAssistant Cloud -> Remote Control -> Nabu Casa URL` and don't forget to add `/api` to the end of the copied string.
![Nabu Casa Remote Control](images/Nabu_Casa_Remote_Control.png)
@@ -255,16 +334,34 @@ Unfortunately the Settings dialogue box in the Garmin IQ application "times out"
<img src="images/GarminHomeAssistantSettings.png" width="400" title="Application Settings"/>
1. Copy and paste your API key you've just created into the top field.
2. Add the URL for your Home Assistant API, e.g. `https://<homeassistant>/api`. (No trailing slash `/`` character as one gets appended when creating the URL and you do not want two.)
2. Add the URL for your HomeAssistant API, e.g. `https://<homeassistant>/api`. (No trailing slash `/`` character as one gets appended when creating the URL and you do not want two.)
3. Add the URL of your JSON file, e.g. `https://<homeassistant>/local/garmin/<something>.json`.
You should now have a working application on your watch and be able to operate your Home Assistant devices for as long as your watch is within Bluetooth range of your phone.
You should now have a working application on your watch and be able to operate your HomeAssistant devices for as long as your watch is within Bluetooth range of your phone.
You may choose to cache your menu definition on your device in order to reduce the delay in showing the menu (as it saves waiting for an HTTP GET request). If you use this option you are responsible for managing the cache when the menu is updated at source. The toggle option below the cache option allows you to choose to refresh the cache the next time the application starts. Once the cache has been cleared, the application will reset this toggle for you, so you do not need to return to the settings to amend it.
### Changes to the (JSON) Dashboard Definition & Caching
The application uses vibration to confirm the action has been requested, as opposed to the 'toast' appears to show the action has been successfully executed. This is enabled by default but may be turned off if you do not desire this behaviour.
Without caching enabled, when you change the JSON file defining your dashboard, you must exit the application and the reopen it. It only takes a matter of a few seconds to pick up the new definition.
The application timeout prevents the HomeAssistant App running on your watch when you have forgotten to close it. It prevents the refreshing of the menu statuses and therefore excessive wear on your battery level. For those users who prefer to keep the application open all the time for continuous use, they can reduce the battery wear by increasing the "poll delay". This inserts a user configurable number of seconds between each round of item update checks, hence reducing the API access activity. This also reduces the responsive of the statuses displayed when HA devices are switched externally, i.e. by another Home Assistant client, then the watch menu display will not update as quickly. Therefore if you only use the HomeAssistant App briefly now and then, keep this setting at the default 0 seconds. NB. To be clear, all items are updated then a configurable delay is inserted before the next round of all item updates. If your poll delay is greater than zero, then your application timeout should be set to zero, otherwise you will exit the application and negate the value of the poll delay function.
You may choose to cache your menu definition on your device in order to reduce the delay in showing the menu (as it saves waiting for an HTTP GET request). If you use this option you need to be aware of how updates to the menu are managed. You may either:
1. **Choose to have the cache cleared.** The toggle option below the cache option allows you to choose to refresh the cache the next time the application starts. Once the cache has been cleared, the application will reset this toggle for you, so you do not need to return to the settings to amend it.
2. **Let the application retrieve the menu after starting and setting up the switch states** (including evaluating [templates](examples/Templates.md)), and then verify you have the latest menu. If a newer menu is retrieved you will be notified via a 'toast' or blue screen for devices without a toast in their API. You will be prompted to restart the application in order to build the menu from this latest menu definition. **This method has proven tricky in older devices with less memory.** Hence it can be turned off to avoid "Out of Memory" crashes. The application tries to protect against crashes by detecting insufficient memory and disabling the option (but note that this may require some tuning). Hence this option is off by default in case it causes a crash and new users are unaware of the potential cause.
**Summary:** The two cache options are therefore distinct, the **first is a manual** forced refresh (the old way). The menu is refreshed on start up and no restart is required. The **second enables automatic checking** after starting and after presenting a usable menu with no extra delay but then any detected changes require a restart.
Whilst it would be a smoother experience, there are no plans to make the menu definition update dynamically recreate the rendered menu items without a restart because:
1. Re-rendering the menu could change the selected item just as you action it.
2. V3.3 proved that older devices are now reaching their memory limits. If you have an old device with limited memory to spare you will probably find the App disables the automatic method for you. If your device crashes with this option turned on, best turn it off manually and let me know via a [Github issue](https://github.com/house-of-abbey/GarminHomeAssistant/issues). This will allow us to fine tune the conditions for insufficient memory. We will then ask you to perform a [small task to retrieve the debug information](https://developer.garmin.com/connect-iq/core-topics/debugging/) we need about memory usage.
3. Restarting is simple for the user and simpler for the code.
### Vibration
The application uses vibration to confirm the action has been requested, which is different to the 'toast' that appears to show the action has been successfully executed. This is enabled by default but may be turned off if you do not desire this behaviour.
### Power Management
The application timeout prevents the HomeAssistant App running on your watch when you have forgotten to close it. It prevents the refreshing of the menu statuses and therefore excessive wear on your battery level. For those users who prefer to keep the application open all the time for continuous use, they can reduce the battery wear by increasing the "poll delay". This inserts a user configurable number of seconds between each round of item update checks, hence reducing the API access activity. This also reduces the responsive of the statuses displayed when HA devices are switched externally, i.e. by another HomeAssistant client, then the watch menu display will not update as quickly. Therefore if you only use the HomeAssistant App briefly now and then, keep this setting at the default 0 seconds. NB. To be clear, all items are updated then a configurable delay is inserted before the next round of all item updates. If your poll delay is greater than zero, then your application timeout should be set to zero, otherwise you will exit the application and negate the value of the poll delay function.
| Application Timeout | Poll Delay | Comment |
|:-------------------:|:----------:|:--------|
@@ -277,9 +374,13 @@ There is a second timeout value for confirmation views. This is intended for use
The confirmation timeout is also used for the maximum time between clicks in the PIN confirmation dialog. The PIN confirmation provides a more secure alternative for toggling security-sensitive actions.
### Text Alignment
There is a toggle setting for "text alignment" that provides finer adjustment for right-to-left languages. Perhaps this could be made automatic based on device language?
The application and widget both include a background service to report your watch's battery level and charging status. You may enable a background service to report the battery level to your Home Assistant. This is not available over your Bluetooth connection like with other Bluetooth devices as Garmin did not implement it. This no longer requires any setup, and we offer this [trouble shooting](TroubleShooting.md#watch-battery-level-reporting) guide. The last field here is readonly and allows the user to copy & paste the Webhook ID setup by the application when required for this trouble shooting guide.
### Background Service
The application and widget both include a background service to report your watch's battery level and charging status. You may enable a background service to report the battery level to your HomeAssistant. This is not available over your Bluetooth connection like with other Bluetooth devices as Garmin did not implement it. This no longer requires any setup, and we offer this [trouble shooting](TroubleShooting.md#watch-battery-level-reporting) guide. The last field here is readonly and allows the user to copy & paste the Webhook ID setup by the application when required for this trouble shooting guide.
## Tap Item Response
@@ -287,11 +388,11 @@ Its obvious that a toggle menu item has been triggered as the visible switch cha
<img src="images/SimTapResponse.png" width="400" title="Tap Triggered"/>
The application will display a 'toast' showing Home Assistant's friendly name of the triggered item. The toast will disappear after a short while if not dismissed by the user. N.B. There are reports that on the Forerunner 55 device, the toasts do not dissapear without manual intervention. On other devices like the Venu 2 the toast can take 15 seconds to dissappear if not dismissed. Unfortunately, there is no API call to change this behaviour.
The application will display a 'toast' showing HomeAssistant's friendly name of the triggered item. The toast will disappear after a short while if not dismissed by the user. N.B. There are reports that on the Forerunner 55 device, the toasts do not dissapear without manual intervention. On other devices like the Venu 2 the toast can take 15 seconds to dissappear if not dismissed. Unfortunately, there is no API call to change this behaviour.
## External Device Changes
Home Assistant will inevitably change the state of devices you are also controlling via your Garmin. The Garmin application does not maintain a web socket to listen for changes. Instead it must poll the Home Assistant API with your key. Therefore the application is not that responsive to changes. Instead there will be a delay of multiples of 100 ms per item whose status needs to be checked and amended.
HomeAssistant will inevitably change the state of devices you are also controlling via your Garmin. The Garmin application does not maintain a web socket to listen for changes. Instead it must poll the HomeAssistant API with your key. Therefore the application is not that responsive to changes. Instead there will be a delay of multiples of 100 ms per item whose status needs to be checked and amended.
The per toggle item delay is caused by a queue of responses to web requests. The responses fill up a buffer and in early testing we observed [`Communications.BLE_QUEUE_FULL`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html) response codes. For a Venu 2 Garmin watch an API call delay of 600 ms was found to be sustainable (500 ms was still too fast). The code now chains a sequence of updates, so as one finishes it invokes the next item's update. **The more items requiring a status update that you pack into your dashboard, the slower each individual item will be updated!**
@@ -299,10 +400,6 @@ The thinking here is that the watch application will only ever be open briefly n
To prevent excessive battery usage, set the application timeout in the settings. This will prevent you from leaving the application open and forgotten when not being used, and the polling mechanism will then cease, saving battery life. Again, the thinking here is that the watch application will only ever be open briefly not persistently, and hence not be a constant source of battery usage unless the [background service](BackgroundService.md) for sending any watch status is used aggressively fast.
## Changes to the (JSON) Dashboard Definition
When you change the JSON file defining your dashboard, you must exit the application and the reopen it. It only takes a matter of a few seconds to pick up the new definition, but it is not automatic. *Don't forget* you may need to choose to clear your cached menu.
## Submitting Corrections for Translations
Initially all text has been created in English, and a [Python script](https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/translate.py) (Google Translate under the hood) has been used to create the first version of all translations. We have been pleased to accept better translations from native language speakers, *thank you*. If you would like to submit improved translations, our preference is you do so via a [Git pull request](https://github.com/house-of-abbey/GarminHomeAssistant/pulls). If you are not comfortable doing this, then just raise an issue and someone will eventually pick the request up.
@@ -324,9 +421,11 @@ The `id` attribute values are taken from the same names used in [`strings.xml`](
## Known Issues
Check the latest unresolved [issues](https://github.com/house-of-abbey/GarminHomeAssistant/issues) on Github. Otherwise the following are persistent issues with no realistic resolution.
1. There are some cases where the file format may be valid JSON, but invalid against the schema, and the failure to catch this error could cause the application to crash. Whilst we have taken care to manage many issues, there may still be cases that are uncaught. Please verify your JSON schema, see the [trouble shooting guide](TroubleShooting.md).
2. On some (old) devices (e.g. Vivoactive 3, Fenix 5s & Edge 520+), the menu does not update correctly to reflect changes in state effected by an external Home Assistant control. E.g. when the phone application changes the toggle status of a switch, the Garmin application does not reflect that change until the menu is touched or scrolled a little. This is a [known issue](https://forums.garmin.com/developer/connect-iq/i/bug-reports/menu2-doesn-t-allow-live-updates) already reported without a suggested software fix.
2. On some (old) devices (e.g. Vivoactive 3, Fenix 5s & Edge 520+), the menu does not update correctly to reflect changes in state effected by an external HomeAssistant control. E.g. when the phone application changes the toggle status of a switch, the Garmin application does not reflect that change until the menu is touched or scrolled a little. This is a [known issue](https://forums.garmin.com/developer/connect-iq/i/bug-reports/menu2-doesn-t-allow-live-updates) already reported without a suggested software fix.
3. The iPhone Connect IQ application has a bug in it we cannot be responsible for. Thanks to user [a_smart_hoome](https://community.home-assistant.io/u/a_smart_hoome) who worked the problem with the dropped Internet connection, see his explanation at https://community.home-assistant.io/t/home-assistant-app-for-garmin/637348/61 for details. Please complain to the Connect IQ application developers rather than us!
@@ -334,14 +433,18 @@ The `id` attribute values are taken from the same names used in [`strings.xml`](
5. Parameters to tap menu items cannot have their parameter usage verified. If you get this wrong and crash the application, that's your fault not the application's. In this case, start by removing the parameters for the menu item causing the crash, and add them back one at a time until you find your fault. **Please don't give the application a poor review for your bad parameter definition!**
6. We are unable to support Edge 540, Edge 840 and Edge 1050 devices at this time. The simulation of these devices has two unexpected errors when toggling or executing taps. We get both `Communications.NETWORK_RESPONSE_OUT_OF_MEMORY` and `Communications.BLE_QUEUE_FULL` even though the memory usage is about 6% of the available RAM. Based on a lead from user @Petucky, both devices are being re-enabled as testing on a real Edge 840 device has proven successful, however we remain unable to support either devices until the simulator is fixed.
6. We are unable to support Edge 540, Edge 840 and Edge 1050 devices at this time. The simulation of these devices has two unexpected errors when toggling or executing taps. We get both `Communications.NETWORK_RESPONSE_OUT_OF_MEMORY` and `Communications.BLE_QUEUE_FULL` even though the memory usage is about 6% of the available RAM. Based on a lead from user @Petucky, both devices are being re-enabled as testing on a real Edge 840 device has proven successful, however we remain unable to support either devices until the simulator is fixed. The Edge 850 device has different display update issues but is functional. Again the assumption is the simulation model is buggy. Please [report](https://github.com/house-of-abbey/GarminHomeAssistant/issues) your experience on real devices to us so we can withdraw support or confirm they are working.
7. We are unable to support HTTP natively (without the workaround specified earlier). This is a limitation placed upon us by the Connect IQ API which for security reasons refuses to work with HTTP requests. There is nothing developers can do about this limitation. See the [Trouble Shooting](TroubleShooting.md#do-it-yourself-setup) guide for an example setup. We would appreciate it if users did not leave poor reviews for the lack of this feature which is beyond our control to fix.
8. There is a [bug in Garmin Express so that when you use that software to amend the application's settings](https://github.com/house-of-abbey/GarminHomeAssistant/issues/194), the page appears in a random language not of your choice. I would like to thank user [heviiguy](https://github.com/heviiguy) for his work researching the issue, leading to these references that indicate the authors of Garmin Home Assistant cannot resolve this issue as its a bug in Garmin Express that Garmin are refusing to believe exists! See these pages for details:
8. There is a [bug in Garmin Express so that when you use that software to amend the application's settings](https://github.com/house-of-abbey/GarminHomeAssistant/issues/194), the page appears in a random language not of your choice. I would like to thank user [heviiguy](https://github.com/heviiguy) for his work researching the issue, leading to these references that indicate the authors of Garmin HomeAssistant cannot resolve this issue as its a bug in Garmin Express that Garmin are refusing to believe exists! See these pages for details:
- [Garmin Express - Wrong Language](https://forums.garmin.com/developer/connect-iq/i/bug-reports/garmin-express---wrong-language)
- [Incorrect language displayed for custom data fields](https://forums.garmin.com/developer/connect-iq/f/discussion/388137/incorrect-language-displayed-for-custom-data-fields)
9. When using Wi-Fi or LTE to toggle a light, the `toggle` will fail when the default or current state of the application's menu does not match the state of the light. The same applies to a cover or other thing that can be toggled. This is because the application is unable to initialise the menu with the current state without Bluetooth. Hence the Wi-Fi/LTE functionality is best used with `tap` items only.
10. There are memory limits, particularly for older devices. Please see the [explanation of the memory limits](Devices.md) and device support.
# Authors & Contributors
For an up to date list of all authors and contributors, please check the [contributor's page](https://github.com/house-of-abbey/GarminHomeAssistant/graphs/contributors). Thank you all for improving this application.

View File

@@ -1,4 +1,4 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# Troubleshooting Guides
@@ -6,8 +6,8 @@
Before [raising an issue](https://github.com/house-of-abbey/GarminHomeAssistant/issues) about a possible bug, _please, please_ check your JSON is compliant with both the JSON format and our schema. To do this you have options. The first is what we use.
1. **Best!** Use the GarminHomeAssistant [Web-based Editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) which includes `entity` and `service` name completion and validation by fetching data from your own Home Assistant instance. _Pretty nifty eh?_ The other methods listed below do not add this convenience and checking.
2. Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for Home Assistant. You can then edit your JSON file in place.
1. **Best!** Use the GarminHomeAssistant [Web-based Editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) which includes `entity` and `service` name completion and validation by fetching data from your own HomeAssistant instance. _Pretty nifty eh?_ The other methods listed below do not add this convenience and checking.
2. Use the [Studio Code Server](https://community.home-assistant.io/t/home-assistant-community-add-on-visual-studio-code/107863) addon for HomeAssistant. You can then edit your JSON file in place.
3. Locally installed VSCode, or if not installed, try
4. The on-line version at https://vscode.dev/, which works really well. Paste in your JSON (and change the file type to JSON if not saving), it will then verify your file format and schema for you, highlighting any errors for you to fix.
@@ -23,7 +23,7 @@ With either of the following setups, there are inevitably some problems along th
### Nabu Casa Setup
You can purchase cloud-based access to your Home Assistant from [Nabu Casa](https://www.nabucasa.com/), and then your setup will look something like this.
You can purchase cloud-based access to your HomeAssistant from [Nabu Casa](https://www.nabucasa.com/), and then your setup will look something like this.
![Nabu Casa Setup](images/nabu_casa_setup.png)
@@ -67,9 +67,9 @@ This URL is very simple, you should be able to read the contents returned in a s
The browser page should then display the JSON string you saved to the file on the web server. The point is this is a simple HTTP GET request with no bells and whistles.
The menu configuration can be hosted anywhere, it does not have to be on the Home Assistant web server. Just as long as it is reachable from your phone from which you Bluetooth connect to your watch, or you watch if it has direct Internet access.
The menu configuration can be hosted anywhere, it does not have to be on the HomeAssistant web server. Just as long as it is reachable from your phone from which you Bluetooth connect to your watch, or you watch if it has direct Internet access.
### Home Assistant API URL
### HomeAssistant API URL
This is slightly trickier owning to the need to supply the API key. Here are three ways you can test your API URL is correctly configured. If successful, each of these should produce a JSON string output looking like:
@@ -124,8 +124,8 @@ There's an online way of testing the API URL too, thanks to [REQBIN](https://req
With thanks to [@ziceva](https://github.com/ziceva) for solving this problem. The symptoms are:
1. Using an API URL with SSL (HTTPS), the [web-based editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) running in a browser on the same phone running Garmin Connect works well.
2. The exact same configuration is set in the Garmin Home Assistant application.
3. The Garmin Home Assistant application reports:
2. The exact same configuration is set in the Garmin HomeAssistant application.
3. The Garmin HomeAssistant application reports:
```
API: not available
Menu: not available
@@ -153,7 +153,7 @@ To verify if you have this issue you can use a tool like [SSL Shoppers's SSL Che
## Watch Battery Level Reporting
For this you will need to have already got the main application or widget working with a menu in order to prove that the API calls are successful. We have proven this works with both our home brew infrastructure as well as Nabu Casa. Now with a script similar to one of the following two, you should be able to fake the watch API call and verify receipt by Home Assistant.
For this you will need to have already got the main application or widget working with a menu in order to prove that the API calls are successful. We have proven this works with both our home brew infrastructure as well as Nabu Casa. Now with a script similar to one of the following two, you should be able to fake the watch API call and verify receipt by HomeAssistant.
#### Battery: Linux, MacOS, UNIX, Cygwin etc
@@ -311,9 +311,25 @@ JSON for copy & paste:
}
```
# Failed API Calls
![No JSON](images/NoJson.png)
When the application persists in reporting _"No JSON returned from HTTP request"_ this might be due to a mismatch between the Webhook ID and the device settings on the HomeAssistant server. We have discovered that the Webhook ID is required for HomeAssistant API calls with templates in order to work in a non-privileged account. The application options include the ability to clear the Webhook ID in the application forcing a new one to be set up. This should prevent the above error being shown on startup.
![HTTP 410](images/http_410_error.jpg)
We now also have reports of an [HTTP 410](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/410) error occurring after an application update. With thanks to [@Aaroneisele55](https://github.com/Aaroneisele55) for resolving this issue also by the clearing of the Webhook ID. The cause of the problem remains unknown as updates do not generally require this correction between the Home Assistant server and the watch settings.
**Therefore, when the URL is known to work, any failure to return the JSON menu definition from an HTTPS request should try resetting the Webhook ID used with Home Assistant.**
To reset the Webhook ID look for this option in the application settings:
![Nabu Casa Setup](images/delete_webhook_id.png)
# Debug Logs
As a desperate measure to assist with debugging the Home Assistant Application, you might be asked to send the authors a debug log.
As a desperate measure to assist with debugging the HomeAssistant Application, you might be asked to send the authors a debug log.
![How to find the debug log file](images/debug_log_location.png)

View File

@@ -1,8 +1,8 @@
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
[Home](README.md) | [Switches](examples/Switches.md) | [Actions](examples/Actions.md) | [Templates](examples/Templates.md) | [Numeric](examples/Numeric.md) | [Glance](examples/Glance.md) | [Background Service](BackgroundService.md) | [Wi-Fi](Wi-Fi.md) | [HTTP Headers](HTTP_Headers.md) | [Trouble Shooting](TroubleShooting.md) | [Version History](HISTORY.md)
# Wi-Fi & LTE
Many watches now include the ability to synchronise data over Wi-Fi or event LTE in addition to Bluetooth. This gives users of this application the expectation that they should be able to operate Home Assistant devices from their watch without Bluetooth and hence their phone (that they left out of contact distance). The whole point of Bluetooth after all is that it is [low power](https://en.wikipedia.org/wiki/Bluetooth#Uses). Using Wi-Fi and LTE are power hungry and therefore not something that can be left on continuously in a small device. The watch function that uses Wi-Fi & LTE is the ability to 'synchronise', e.g. activity data (FIT files) and application updates. This function then has a limited period of time for which radio is active. Neither Wi-Fi nor LTE are "always on" like Bluetooth.
Many watches now include the ability to synchronise data over Wi-Fi or event LTE in addition to Bluetooth. This gives users of this application the expectation that they should be able to operate HomeAssistant devices from their watch without Bluetooth and hence their phone (that they left out of contact distance). The whole point of Bluetooth after all is that it is [low power](https://en.wikipedia.org/wiki/Bluetooth#Uses). Using Wi-Fi and LTE are power hungry and therefore not something that can be left on continuously in a small device. The watch function that uses Wi-Fi & LTE is the ability to 'synchronise', e.g. activity data (FIT files) and application updates. This function then has a limited period of time for which radio is active. Neither Wi-Fi nor LTE are "always on" like Bluetooth.
With version 3.0 onwards the application now includes the ability to temporarily turn on Wi-Fi or LTE in order to perform a task on the watch. To do this, the "synchronise" function of the Connect IQ SDK has been cleverly hijacked. This appears to be a highly sought after solution from several users as **it allows the watch to operate when out of range of the associated phone**.

View File

@@ -93,7 +93,7 @@ if not exist %DEST% (
)
echo.
echo Starting compilation for simulation on %DEVICE%.
echo Starting compilation for simulation on '%DEVICE%'.
echo.
rem call %SDK_PATH%\connectiq.bat
@@ -109,8 +109,9 @@ rem Compile PRG for a single device for side loading
--jungles %SRC%\%JUNGLE% ^
--private-key %SRC%\..\developer_key ^
--device %DEVICE%_sim ^
--warn ^
--release
--warn
rem --release
if %ERRORLEVEL% equ 0 (
%SDK_PATH%\monkeydo.bat %SRC%\bin\HomeAssistant.prg %DEVICE%

View File

@@ -17,7 +17,10 @@
"$ref": "#/$defs/items"
}
},
"required": ["title", "items"],
"required": [
"title",
"items"
],
"additionalProperties": false,
"$defs": {
"toggle": {
@@ -37,28 +40,26 @@
"$ref": "#/$defs/content"
},
"tap_action": {
"type": "object",
"properties": {
"confirm": {
"$ref": "#/$defs/confirm"
},
"pin": {
"$ref": "#/$defs/pin"
}
},
"$ref": "#/$defs/tap_action",
"additionalProperties": false
},
"enabled": {
"$ref": "#/$defs/enabled"
},
"exit": {
"$ref": "#/$defs/exit"
"$ref": "#/$defs/exit",
"deprecated": true
}
},
"required": ["entity", "name", "type"],
"required": [
"entity",
"name",
"type"
],
"additionalProperties": false
},
"template": {
"deprecated": true,
"oneOf": [
{
"type": "object",
@@ -86,7 +87,11 @@
"$ref": "#/$defs/enabled"
}
},
"required": ["name", "content", "type"],
"required": [
"name",
"content",
"type"
],
"additionalProperties": false
},
{
@@ -109,16 +114,22 @@
"description": "Use 'info' or 'tap' instead."
},
"tap_action": {
"$ref": "#/$defs/tap_action"
"$ref": "#/$defs/tap_action_tap"
},
"enabled": {
"$ref": "#/$defs/enabled"
},
"exit": {
"$ref": "#/$defs/exit"
"$ref": "#/$defs/exit",
"deprecated": true
}
},
"required": ["name", "content", "type", "tap_action"],
"required": [
"name",
"content",
"type",
"tap_action"
],
"additionalProperties": false
}
]
@@ -140,7 +151,11 @@
"$ref": "#/$defs/enabled"
}
},
"required": ["name", "content", "type"],
"required": [
"name",
"content",
"type"
],
"additionalProperties": false
},
"tap": {
@@ -160,22 +175,26 @@
"$ref": "#/$defs/content"
},
"service": {
"$ref": "#/$defs/entity",
"$ref": "#/$defs/action",
"deprecated": true,
"title": "Schema change:",
"description": "Use 'tap_action' instead to mirror Home Assistant."
},
"tap_action": {
"$ref": "#/$defs/tap_action"
"$ref": "#/$defs/tap_action_tap"
},
"enabled": {
"$ref": "#/$defs/enabled"
},
"exit": {
"$ref": "#/$defs/exit"
"$ref": "#/$defs/exit",
"deprecated": true
}
},
"required": ["name", "type"],
"required": [
"name",
"type"
],
"additionalProperties": false
},
"group": {
@@ -210,31 +229,698 @@
"$ref": "#/$defs/enabled"
}
},
"required": ["name", "title", "type", "items"],
"required": [
"name",
"title",
"type",
"items"
],
"additionalProperties": false
},
"numeric": {
"type": "object",
"allOf": [
{
"properties": {
"name": {
"$ref": "#/$defs/name"
},
"type": {
"$ref": "#/$defs/type",
"const": "numeric"
},
"content": {
"$ref": "#/$defs/content"
},
"tap_action": {
"$ref": "#/$defs/tap_action",
"properties": {
"action": {
"$ref": "#/$defs/action"
},
"picker": {
"type": "object",
"title": "Number picker configuration",
"description": "'attribute' field is optional.",
"properties": {
"min": {
"type": "number",
"title": "Minimum Value"
},
"max": {
"type": "number",
"title": "Maximum Value"
},
"step": {
"type": "number",
"title": "Step Size"
},
"attribute": {
"type": "string",
"title": "Attribute on the entity",
"description": "Attribute on the entity with the current numeric value. To use the state of the entity, do not specify."
},
"data_attribute": {
"type": "string",
"title": "Attribute on the action data",
"description": "Attribute on the action data for the value to set."
}
},
"required": [
"min",
"max",
"step",
"data_attribute"
]
}
},
"required": [
"action",
"picker"
]
},
"enabled": {
"$ref": "#/$defs/enabled"
},
"exit": {
"$ref": "#/$defs/exit"
},
"entity": {
"$ref": "#/$defs/entity"
}
},
"required": [
"name",
"type",
"entity",
"tap_action"
],
"additionalProperties": false
},
{
"properties": {
"entity": {
"pattern": "^(light|input_number|number|fan|valve|cover|media_player|climate)\\.[^.]+$"
}
},
"if": {
"properties": {
"entity": {
"pattern": "^light\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "light.turn_on"
},
"picker": {
"properties": {
"attribute": {
"const": "brightness"
},
"data_attribute": {
"const": "brightness"
},
"min": {
"type": "integer",
"minimum": 0
},
"max": {
"type": "integer",
"max": 255,
"description": "Lights are not a percentage."
}
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^input_number\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "input_number.set_value"
},
"picker": {
"properties": {
"data_attribute": {
"const": "value"
}
},
"not": {
"required": [
"attribute"
]
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^number\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "number.set_value"
},
"picker": {
"properties": {
"data_attribute": {
"const": "value"
}
},
"not": {
"required": [
"attribute"
]
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^fan\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "fan.set_percentage"
},
"picker": {
"properties": {
"attribute": {
"const": "percentage"
},
"data_attribute": {
"const": "percentage"
},
"min": {
"type": "integer",
"minimum": 0
},
"max": {
"type": "integer",
"maximum": 100
}
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^valve\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "valve.set_valve_position"
},
"picker": {
"properties": {
"attribute": {
"const": "position"
},
"data_attribute": {
"const": "position"
},
"min": {
"type": "integer",
"minimum": 0
},
"max": {
"type": "integer",
"maximum": 100
}
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^cover\\.[^.]+$"
}
}
},
"then": {
"allOf": [
{
"properties": {
"tap_action": {
"properties": {
"action": {
"enum": [
"cover.set_position",
"cover.set_tilt_position"
]
}
}
}
}
},
{
"if": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "cover.set_tilt_position"
}
}
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "cover.set_tilt_position"
},
"picker": {
"properties": {
"attribute": {
"const": "tilt_position"
},
"data_attribute": {
"const": "tilt_position"
},
"min": {
"type": "integer",
"minimum": 0
},
"max": {
"type": "integer",
"maximum": 100
}
}
}
}
}
}
},
"else": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "cover.set_position"
},
"picker": {
"properties": {
"attribute": {
"const": "position"
},
"data_attribute": {
"const": "position"
},
"min": {
"type": "integer",
"minimum": 0
},
"max": {
"type": "integer",
"maximum": 100
}
}
}
}
}
}
}
}
]
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^media_player\\.[^.]+$"
}
}
},
"then": {
"properties": {
"tap_action": {
"properties": {
"action": {
"const": "media_player.volume_set"
},
"picker": {
"properties": {
"attribute": {
"const": "volume_level"
},
"data_attribute": {
"const": "volume_level"
},
"min": {
"type": "number",
"minimum": 0
},
"max": {
"type": "number",
"maximum": 1,
"description": "Fraction [0,1], not percentage."
}
}
}
}
}
}
},
"else": {
"if": {
"properties": {
"entity": {
"pattern": "^climate\\.[^.]+$"
}
}
},
"then": {
"tap_action": {
"properties": {
"properties": {
"action": {
"const": "climate.set_temperature"
},
"picker": {
"properties": {
"attribute": {
"const": "temperature"
},
"data_attribute": {
"const": "temperature"
}
},
"not": {
"required": [
"attribute"
]
}
}
}
}
}
}
}
}
}
}
}
}
}
}
]
},
"type": {
"title": "Menu item type",
"description": "One of 'info', 'tap', 'toggle' or 'group'."
"description": "One of 'info', 'tap', 'toggle', 'group' or 'numeric'."
},
"items": {
"type": "array",
"items": {
"oneOf": [
"examples": [
{
"$ref": "#/$defs/toggle"
"type": "tap",
"name": "Example",
"tap_action": {
"action": "notify.notify",
"data": {
"message": "Example"
}
}
},
{
"$ref": "#/$defs/template"
"type": "toggle",
"name": "Example",
"entity": "switch.example"
},
{
"$ref": "#/$defs/tap"
"type": "group",
"name": "Example",
"title": "Example",
"items": []
},
{
"$ref": "#/$defs/info"
"type": "numeric",
"name": "Example",
"entity": "light.example",
"tap_action": {
"action": "light.turn_on",
"picker": {
"attribute": "brightness",
"data_attribute": "brightness",
"min": 0,
"max": 255,
"step": 1
}
}
},
{
"$ref": "#/$defs/group"
"type": "numeric",
"name": "Example",
"entity": "input_number.example",
"tap_action": {
"action": "input_number.set_value",
"picker": {
"data_attribute": "value",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "number.example",
"tap_action": {
"action": "number.set_value",
"picker": {
"data_attribute": "value",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "fan.example",
"tap_action": {
"action": "fan.set_percentage",
"picker": {
"attribute": "percentage",
"data_attribute": "percentage",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "valve.example",
"tap_action": {
"action": "valve.set_valve_position",
"picker": {
"attribute": "position",
"data_attribute": "position",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "cover.example",
"tap_action": {
"action": "cover.set_position",
"picker": {
"attribute": "position",
"data_attribute": "position",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "cover.example",
"tap_action": {
"action": "cover.set_tilt_position",
"picker": {
"attribute": "tilt_position",
"data_attribute": "tilt_position",
"min": 0,
"max": 100,
"step": 1
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "media_player.example",
"tap_action": {
"action": "media_player.volume_set",
"picker": {
"attribute": "volume_level",
"data_attribute": "volume_level",
"min": 0,
"max": 1,
"step": 0.01
}
}
},
{
"type": "numeric",
"name": "Example",
"entity": "climate.example",
"tap_action": {
"action": "climate.set_temperature",
"picker": {
"attribute": "temperature",
"data_attribute": "temperature"
}
}
}
],
"allOf": [
{
"properties": {
"type": {
"enum": [
"toggle",
"template",
"tap",
"info",
"group",
"numeric"
]
}
}
},
{
"if": {
"properties": {
"type": {
"const": "toggle"
}
}
},
"then": {
"$ref": "#/$defs/toggle"
},
"else": {
"if": {
"properties": {
"type": {
"const": "template"
}
}
},
"then": {
"$ref": "#/$defs/template"
},
"else": {
"if": {
"properties": {
"type": {
"const": "tap"
}
}
},
"then": {
"$ref": "#/$defs/tap"
},
"else": {
"if": {
"properties": {
"type": {
"const": "info"
}
}
},
"then": {
"$ref": "#/$defs/info"
},
"else": {
"if": {
"properties": {
"type": {
"const": "group"
}
}
},
"then": {
"$ref": "#/$defs/group"
},
"else": {
"if": {
"properties": {
"type": {
"const": "numeric"
}
}
},
"then": {
"$ref": "#/$defs/numeric"
}
}
}
}
}
}
}
]
}
@@ -248,43 +934,82 @@
"title": "Home Assistant entity name",
"pattern": "^[^.]+\\.[^.]+$"
},
"service": {
"action": {
"type": "string",
"title": "Home Assistant service name",
"title": "Home Assistant action name",
"pattern": "^[^.]+\\.[^.]+$"
},
"tap_action_tap": {
"allOf": [
{
"title": "Tap Action",
"description": "'confirm' and 'pin' fields are optional. 'action' is required.",
"properties": {
"service": {
"$ref": "#/$defs/action",
"deprecated": true
},
"action": {
"$ref": "#/$defs/action"
},
"data": {
"type": "object",
"title": "Your actions's parameters",
"description": "The object containing the parameters and their values to be passed to the entity. No schema checking can be done here, you are on your own! On application crash, remove the parameters."
}
},
"oneOf": [
{
"required": [
"action"
],
"not": {
"required": [
"service"
]
}
},
{
"required": [
"service"
]
}
]
},
{
"$ref": "#/$defs/tap_action"
}
]
},
"tap_action": {
"type": "object",
"title": "Action",
"description": "'confirm' field is optional.",
"title": "Tap Action",
"description": "'confirm' and 'pin' fields are optional.",
"properties": {
"service": {
"$ref": "#/$defs/service"
},
"confirm": {
"$ref": "#/$defs/confirm"
},
"pin": {
"$ref": "#/$defs/pin"
},
"data": {
"type": "object",
"title": "Your services's parameters",
"description": "The object containing the parameters and their values to be passed to the entity. No schema checking can be done here, you are on your own! On application crash, remove the parameters."
"exit": {
"$ref": "#/$defs/exit"
}
},
"required": ["service"]
}
},
"content": {
"title": "Home Assistant Template",
"description": "Jinja2 template defining the text to display. Must be included in an 'info'. Optional in a 'toggle', 'tap' and 'group'. Special characters may not render in the glance context.",
"description": "Jinja2 template defining the text to display. Must be included in an 'info'. Optional in a 'toggle', 'tap', 'numeric' and 'group'. Special characters may not render in the glance context.",
"type": "string"
},
"confirm": {
"type": "boolean",
"type": [
"boolean",
"string"
],
"default": false,
"title": "Confirmation",
"description": "Optional confirmation of the action before execution as a precaution."
"description": "Optional confirmation of the action before execution as a precaution. Use a Boolean for the default message. Specify a string to display a specific confirmation message."
},
"pin": {
"type": "boolean",
@@ -307,7 +1032,10 @@
"$ref": "#/$defs/content"
}
},
"required": ["type", "content"]
"required": [
"type",
"content"
]
},
{
"properties": {
@@ -317,7 +1045,9 @@
"const": "status"
}
},
"required": ["type"]
"required": [
"type"
]
}
]
},

View File

@@ -1,4 +1,4 @@
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Numeric](Numeric.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
# Actions
@@ -11,7 +11,7 @@ A simple example using a scene as a `tap` menu item.
"name": "Telly Scene",
"type": "tap",
"tap_action": {
"service": "scene.turn_on"
"action": "scene.turn_on"
}
},
```
@@ -37,6 +37,14 @@ For example:
"confirm": true
}
}
```
The `confirm` field may contain a string instead of a Boolean in order to provide a custom message to display instead of the default "Sure?" text.
```json
"tap_action": {
"confirm": "Toggle the cover?"
}
```
**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.**
@@ -62,7 +70,7 @@ Note that for notify events, you _must_ not supply an `entity_id` or the API cal
"name": "Message",
"type": "tap",
"tap_action": {
"service": "notify.mobile_app_on_phone",
"action": "notify.mobile_app_on_phone",
"data": {
"title": "This is a title",
"message": "This is the message"
@@ -73,9 +81,9 @@ Note that for notify events, you _must_ not supply an `entity_id` or the API cal
```
> [!IMPORTANT]
> Be careful with the value of the `service` field.
> Be careful with the value of the `action` field.
Note that the `service` field will need to be a locally custom `script.<something>` as soon as any `data` fields are populated and not something more generic like `script.turn_on`. If the `service` field is wrong, the application will fail with a [`Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html) error in the response from your Home Assistant and show the error message as _"No JSON returned from HTTP request"_ on your device. In the [web-based editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) you can use the standard developer tools to observe an `HTTP 400` error which the application does not see. Here we are limited by the [Garmin Connect IQ](https://developer.garmin.com/connect-iq/overview/) software development kit (SDK). We do not have enough information at the point of execution in the application to determine the cause of the error. Nor is there an immediately obvious way of identifying this issue using the JSON schema checks.
Note that the `action` field will need to be a locally custom `script.<something>` as soon as any `data` fields are populated and not something more generic like `script.turn_on`. If the `action` field is wrong, the application will fail with a [`Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html) error in the response from your HomeAssistant and show the error message as _"No JSON returned from HTTP request"_ on your device. In the [web-based editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) you can use the standard developer tools to observe an `HTTP 400` error which the application does not see. Here we are limited by the [Garmin Connect IQ](https://developer.garmin.com/connect-iq/overview/) software development kit (SDK). We do not have enough information at the point of execution in the application to determine the cause of the error. Nor is there an immediately obvious way of identifying this issue using the JSON schema checks.
## Exit on Tap
@@ -87,9 +95,9 @@ You can choose individual items that will quit after they have completed their a
"name": "Turn off Stuff",
"type": "tap",
"tap_action": {
"service": "automation.trigger"
"action": "automation.trigger",
"exit": true
},
"exit": true
}
```
@@ -103,8 +111,69 @@ If you would like to temporarily disable an item in your menu, e.g. for seasonal
"name": "Turn off Stuff",
"type": "tap",
"tap_action": {
"service": "automation.trigger"
"action": "automation.trigger"
},
"enabled": false
}
```
# Selects
Here is an example of how to make a light effect selector:
```json
{
"type": "group",
"name": "Example",
"title": "Light Effect",
"content": "{{ state_attr('light.moon', 'effect') }}",
"items": [
{
"type": "tap",
"name": "None",
"entity": "light.example",
"tap_action": {
"service": "light.turn_on",
"data": {
"effect": "None"
}
}
},
{
"type": "tap",
"name": "Rainbow",
"entity": "light.example",
"tap_action": {
"service": "light.turn_on",
"data": {
"effect": "Rainbow"
}
}
},
{
"type": "tap",
"name": "Glimmer",
"entity": "light.example",
"tap_action": {
"service": "light.turn_on",
"data": {
"effect": "Glimmer"
}
}
},
{
"type": "tap",
"name": "Twinkle",
"entity": "light.example",
"tap_action": {
"service": "light.turn_on",
"data": {
"effect": "Twinkle"
}
}
}
]
}
```
The same pattern works for any selector (`input_select.*`, `select.*`, `climate.*` mode).

View File

@@ -1,4 +1,4 @@
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Numeric](Numeric.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
# Glance
@@ -75,6 +75,6 @@ The following shows the default glance when the menu file is not available at th
<img src="../images/Venu2_glance_no_menu.png" width="200" title="Venu 2 Glance showing errors"/>
Once the custom glance template has been retrieved and evaluated the display will change. Should the connectivity to your Home Assistant then be lost, e.g. you move out of range of your phone, the glance reflects this in the colour of the residual two rectangles. The top one remains an indicator for the API, and the bottom rectangle remains an indicator for the menu availability, reflecting the original placement in the default glance view that has now been replaced.
Once the custom glance template has been retrieved and evaluated the display will change. Should the connectivity to your HomeAssistant then be lost, e.g. you move out of range of your phone, the glance reflects this in the colour of the residual two rectangles. The top one remains an indicator for the API, and the bottom rectangle remains an indicator for the menu availability, reflecting the original placement in the default glance view that has now been replaced.
<img src="../images/Venu2_glance_no_bt.png" width="200" title="Venu 2 Glance showing lost connectivity"/>

167
examples/Numeric.md Normal file
View File

@@ -0,0 +1,167 @@
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Numeric](Numeric.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
# Numeric
Provides a number picker in order to adjust a numeric value of an entity.
## Thermostat
An example using a thermostat as a `numeric` menu item.
```json
{
"name": "Heating",
"content": "{{ ' %.1f' | format(state_attr('climate.room','temperature')) }}",
"type": "numeric",
"entity": "climate.room",
"tap_action": {
"action": "climate.set_temperature",
"picker": {
"step": 0.5,
"min": 10,
"max": 30,
"attribute": "temperature",
"data_attribute": "temperature"
}
}
}
```
This needs some explanation. The `tap_action` object needs a `picker` object to specify the numeric menu item's behaviour. The `picker` object is described in the table below.
Field | Purpose | Mandatory |
-----------------|----------------------------------------------------------------|-----------|
`step` | The increment or decrement step size. | Yes |
`min` | The minimum value the numeric entity can take. | Yes |
`max` | The maximum value the numeric entity can take. | Yes |
`attribute` | The attribute on the `entity` that holds the state to be read. | No |
`data_attribute` | The attribute on the `action` call that sets the state. | Yes |
It may well be the case that often `attribute` and `data_attribute` are the same attribute, as with this example.
## Helper
You might define a "helper" entity as follows in HomeAssistant:
<img src="../images/my_float.png" width="400" title="HomeAssistant Helper definition for an 'input_number'." style="margin:5px"/>
In this case, the state is the actual value, so the template uses `states(..)` instead of `state_attr(..)`, you must not set the optional `attribute` value in the JSON definition so that the application uses the correct template internally for querying the HA server for its present value. Your own template definition in the `content` field will need to follow suit too. The `data_attribute` must be set to `value` for the `action` call that sets the chosen value from the number carousel.
```json
{
"name": "My Float",
"content": "Currently {{ states('input_number.my_float') }}",
"type": "numeric",
"entity": "input_number.my_float",
"tap_action": {
"action": "input_number.set_value",
"picker": {
"step": 0.5,
"min": -10.0,
"max": 10.0,
"data_attribute": "value"
}
}
}
```
## Amplifier
The complication here is this amplifier uses one scale for changing the value, a range 0.0 to 1.0, and another to render the volume on the display, dB. So the template does some scale conversion, but the number picker has to use the 0.0 to 1.0 range which is annoying.
```json
{
"name": "Amplifer Volume",
"content": "{{ '%.1f' | format(state_attr('media_player.amplifier','volume_level') * 100 -80) }} dB ({{ state_attr('media_player.amplifier','volume_level') }})",
"type": "numeric",
"entity": "media_player.amplifier",
"tap_action": {
"action": "media_player.volume_set",
"picker": {
"step": 0.005,
"min": 0.2,
"max": 0.6,
"attribute": "volume_level",
"data_attribute": "volume_level"
}
}
}
```
<img src="../images/number_picker_raw.bmp" width="200" title="HomeAssistant Helper definition for an 'input_number'." style="margin:5px"/>
The above is a little awkward to change the volume as the picker's scale is unfamiliar. To make life easier you might choose to implement a "Template number" in HomeAssistant as defined in the following dialogue box.
<img src="../images/template_number.png" width="500" title="HomeAssistant Helper definition for an 'input_number'." style="margin:5px"/>
For copy and paste, the Jinja2 fields are as follows:
1. Template rendering with conversion to dB:
```jinja
{{ state_attr('media_player.amplifier','volume_level') * 100 -80 }}
```
2. Conversion from dB to range 0.0 to 1.0:
```jinja
{{ (value+80)/100 }}
```
3. Availability template:
```jinja
{{ not is_state('media_player.amplifier','unavailable') }}
```
<img src="../images/number_picker_db.bmp" width="200" title="HomeAssistant Helper definition for an 'input_number'." style="margin:5px"/>
As an alternative to using the GUI, the following can be pasted into HomeAssistant's `configuration.yaml`:
```yaml
template:
- number:
- name: "Amplifier dB"
unique_id: "<Generate Unique ID>"
unit_of_measurement: "dB"
state: "{{ state_attr('media_player.amplifier','volume_level') * 100 -80 }}"
availability: "{{ not is_state('media_player.amplifier','unavailable') }}"
set_value:
- action: media_player.volume_set
target:
entity_id: media_player.amplifier
data:
volume_level: "{{ (value+80)/100 }}"
step: 0.5
min: -60
max: -15
icon: mdi:audio-video
```
We noticed some schema checking errors when we tried this, but the YAML above is consistent with the HA [Template](https://www.home-assistant.io/integrations/template/#number) support pages, and this code does correctly create the number template as required.
The JSON menu definition can now use dB with the new template number as follows.
```json
{
"name": "Amplifier Volume",
"content": "{% if is_state('media_player.amplifier','unavailable') %}Off{% else %}{{ '%.1f' | format(states('number.amplifier_db') | float) }} dB{% endif %}",
"type": "numeric",
"entity": "number.amplifier_db",
"tap_action": {
"action": "number.set_value",
"picker": {
"step": 0.5,
"min": -60.0,
"max": -15.0,
"data_attribute": "value"
}
}
},
```
## Trouble Shooting
Specific to this menu item:
1. If the number picker does not initialise with the correct value, amend the `attribute` field. Just because your template renders does not mean the application has extracted the numeric value as the `content` template is rendered on the HomeAssistant server.

View File

@@ -1,4 +1,4 @@
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Numeric](Numeric.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
# Switches
@@ -48,12 +48,12 @@ switch:
friendly_name: <name>
value_template: <value>
turn_on:
service: <service>
action: <action>
data:
entity_id: <entity>
<attribute>: <value>
turn_off:
service: <service>
action: <action>
data:
entity_id: <entity>
<attribute>: <value>
@@ -90,11 +90,11 @@ switch:
friendly_name: Cover
value_template: "{{ is_state('cover.cover', 'open') }}"
turn_on:
service: cover.open_cover
action: cover.open_cover
data:
entity_id: cover.cover
turn_off:
service: cover.close_cover
action: cover.close_cover
data:
entity_id: cover.cover
```
@@ -118,7 +118,9 @@ You can choose individual items that will quit after they have completed their a
"entity": "light.hall_light",
"name": "Hall Light & Quit",
"type": "toggle",
"exit": true
"tap_action" {
"exit": true
}
}
```

View File

@@ -1,11 +1,11 @@
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
[Home](../README.md) | [Switches](Switches.md) | [Actions](Actions.md) | [Templates](Templates.md) | [Numeric](Numeric.md) | [Glance](Glance.md) | [Background Service](../BackgroundService.md) | [Wi-Fi](../Wi-Fi.md) | [HTTP Headers](../HTTP_Headers.md) | [Trouble Shooting](../TroubleShooting.md) | [Version History](../HISTORY.md)
# Templates
In order to provide the most functionality possible the content of the menu item comes from a user-defined template (i.e. you generate your own text). This allows you to do some pretty cool things. It also makes the configuration a bit more complicated. This page will help you understand how to use templates.
- In this file anything between `<` and `>` is a placeholder. Replace it with the appropriate value.
- [Jinja2](https://palletsprojects.com/p/jinja/) syntax is used by Home Assistant [Templates](https://www.home-assistant.io/docs/configuration/templating/). Templates are used to dynamically insert values into the content. The syntax includes:
- [Jinja2](https://palletsprojects.com/p/jinja/) syntax is used by HomeAssistant [Templates](https://www.home-assistant.io/docs/configuration/templating/). Templates are used to dynamically insert values into the content. The syntax includes:
- `{%` ... `%}` for Statements
- `{{` ... `}}` for Expressions to print to the template output
- `{#` ... `#}` for Comments not included in the template output
@@ -116,7 +116,7 @@ Note: Only when you use the `tap_action` field do you also need to include the `
"type": "tap",
"content": "{% if is_state('binary_sensor.garage_connected', 'on') %}{{state_translated('cover.garage_door')}} - {{state_attr('cover.garage_door', 'current_position')}}%{%else%}Unconnected{% endif %}",
"tap_action": {
"service": "cover.toggle",
"action": "cover.toggle",
"pin": true
}
}
@@ -173,7 +173,7 @@ An example of a dimmer light with 4 brightness settings 0..3. Here our light wor
"type": "tap",
"content": "{% if not (is_state('light.green_house', 'off') or is_state('light.green_house', 'unavailable')) %}{{ (((state_attr('light.green_house', 'brightness') | float) / 255 * 100) | round(0)) | int }}%{% else %}Off{% endif %}",
"tap_action": {
"service": "light.turn_on",
"action": "light.turn_on",
"data": {
"brightness_pct": 12
}
@@ -184,7 +184,7 @@ An example of a dimmer light with 4 brightness settings 0..3. Here our light wor
"name": "LEDs 1",
"type": "tap",
"tap_action": {
"service": "light.turn_on",
"action": "light.turn_on",
"data": {
"brightness_pct": 37
}
@@ -196,7 +196,7 @@ An example of a dimmer light with 4 brightness settings 0..3. Here our light wor
"type": "tap",
"content": "{% if not (is_state('light.green_house', 'off') or is_state('light.green_house', 'unavailable')) %}{{ (((state_attr('light.green_house', 'brightness') | float) / 255 * 100) | round(0)) | int }}%{% else %}Off{% endif %}",
"tap_action": {
"service": "light.turn_on",
"action": "light.turn_on",
"data": {
"brightness_pct": 62
}
@@ -208,7 +208,7 @@ An example of a dimmer light with 4 brightness settings 0..3. Here our light wor
"type": "tap",
"content": "{% if not (is_state('light.green_house', 'off') or is_state('light.green_house', 'unavailable')) %}{{ (((state_attr('light.green_house', 'brightness') | float) / 255 * 100) | round(0))| int }}%{% else %}Off{% endif %}",
"tap_action": {
"service": "light.turn_on",
"action": "light.turn_on",
"data": {
"brightness_pct": 87
}

23
iconResize.cmd Normal file
View File

@@ -0,0 +1,23 @@
@echo off
rem -----------------------------------------------------------------------------------
rem
rem Distributed under MIT Licence
rem See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
rem
rem -----------------------------------------------------------------------------------
rem
rem GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
rem tested on a Venu 2 device. The source code is provided at:
rem https://github.com/house-of-abbey/GarminHomeAssistant.
rem
rem J D Abbey & P A Abbey, 11 November 2025
rem
rem Run the icon generation Python scripts
rem
rem -----------------------------------------------------------------------------------
REM change the current directory to the batch file's location
cd /d %~dp0
python iconResize.py
python launcherIconResize.py
pause

View File

@@ -30,37 +30,32 @@
#
####################################################################################
from bs4 import BeautifulSoup, Comment
from bs4 import BeautifulSoup
import os
import shutil
output_dir_prefix = 'resources-icons-'
input_dir = output_dir_prefix + '48'
Doub = 0
Sing = 1
Half = 2
# Original icons for 416x416 screen size with 48x48 icons
original = (96, 48, 24)
# Convert icons to different screen sizes by these parameters
lookup = {
# Doub Sing Half
# 0 1 2
454: (106, 53, 27),
# 416: ( 96, 48, 24),
390: ( 90, 46, 23),
360: ( 84, 42, 21),
320: ( 74, 38, 19),
280: ( 64, 32, 16),
260: ( 60, 30, 15),
240: ( 56, 28, 14),
218: ( 50, 26, 13),
208: ( 48, 24, 12),
176: ( 42, 21, 11),
156: ( 36, 18, 9)
}
lookup = [
55,
53,
# 48,
46,
42,
38,
34, # Especially for the instinct3amoled50mm device that clip the icons
32,
30,
28,
26,
24,
"21-w",
21,
"18-w",
18
]
# Delete all but the original 48x48 icon directories
for entry in os.listdir("."):
@@ -68,8 +63,12 @@ for entry in os.listdir("."):
shutil.rmtree(entry)
# (Re-)Create the resized icon directories
for screen_size, icon_sizes in lookup.items():
output_dir = output_dir_prefix + str(icon_sizes[Sing])
for icon_size in lookup:
output_dir = output_dir_prefix + str(icon_size)
white = False
if isinstance(icon_size, str):
white = True
icon_size = int(icon_size.split("-")[0])
print("\nCreate directory:", output_dir)
if os.path.exists(output_dir) and os.path.isdir(output_dir):
shutil.rmtree(output_dir)
@@ -80,16 +79,14 @@ for screen_size, icon_sizes in lookup.items():
with open(input_dir + "/" + entry, "r") as f:
soup = BeautifulSoup(f.read(), features="xml")
svg: BeautifulSoup = list(soup.children)[0]
h = int(svg.attrs["height"])
if (h == original[Doub]):
svg.attrs["width"] = lookup[screen_size][Doub]
svg.attrs["height"] = lookup[screen_size][Doub]
elif (h == original[Sing]):
svg.attrs["width"] = lookup[screen_size][Sing]
svg.attrs["height"] = lookup[screen_size][Sing]
elif (h == original[Half]):
svg.attrs["width"] = lookup[screen_size][Half]
svg.attrs["height"] = lookup[screen_size][Half]
svg.attrs["width"] = icon_size
svg.attrs["height"] = icon_size
if white:
# Add white colour style
svg.find("style", id="colours").string = """
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
"""
with open(output_dir + "/" + entry, "wb") as o:
o.write(svg.encode("utf-8") + b"\n")
elif entry.endswith(".xml"):

Binary file not shown.

Before

Width:  |  Height:  |  Size: 557 KiB

After

Width:  |  Height:  |  Size: 720 KiB

BIN
images/NoJson.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
images/http_410_error.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
images/my_float.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
images/number_picker_db.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

BIN
images/template_number.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

View File

@@ -40,9 +40,9 @@ output_dir_prefix = 'resources-launcher-'
input_dir = output_dir_prefix + '70-70'
# Convert icons to different screen sizes by these parameters
lookup = [26, 30, 33, 35, 36, 40, 54, 60, 61, 62, 65, 80]
lookup = [26, 30, 33, 35, 36, 38, 40, 52, 54, 56, 60, 61, 62, 65, 68, 80]
# Delete all but the original 48x48 icon directories
# Delete all but the original 70x70 icon directories
for entry in os.listdir("."):
if entry.startswith(output_dir_prefix) and entry != input_dir:
shutil.rmtree(entry)

View File

@@ -1,221 +1,230 @@
<?xml version="1.0"?>
<!--
Distributed under MIT Licence
See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
Distributed under MIT Licence
See https://github.com/house-of-abbey/GarminHomeAssistant/blob/main/LICENSE.
GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
tested on a Venu 2 device. The source code is provided at:
https://github.com/house-of-abbey/GarminHomeAssistant.
GarminHomeAssistant is a Garmin IQ application written in Monkey C and routinely
tested on a Venu 2 device. The source code is provided at:
https://github.com/house-of-abbey/GarminHomeAssistant.
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
P A Abbey & J D Abbey & Someone0nEarth, 31 October 2023
Device Information & References:
* https://developer.garmin.com/connect-iq/compatible-devices/
* https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
Device Information & References:
* https://developer.garmin.com/connect-iq/compatible-devices/
* https://developer.garmin.com/connect-iq/device-reference/
philipabbey's Test App id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app"
Live Application id="40131e87-31ff-454b-a8e2-92276ee399d6" type="watch-app"
philipabbey's Test App id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app"
Live Application id="40131e87-31ff-454b-a8e2-92276ee399d6" type="watch-app"
-->
<iq:manifest version="3" xmlns:iq="http://www.garmin.com/xml/connectiq">
<!--
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
to update the application attributes.
-->
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
<!--
Use the following from the Visual Studio Code command palette to edit
the build targets:
"Monkey C: Set Products by Product Category" - Lets you add all products
that belong to the same product category
"Monkey C: Edit Products" - Lets you add or remove any product
-->
<iq:products>
<iq:product id="approachs50"/>
<iq:product id="approachs7042mm"/>
<iq:product id="approachs7047mm"/>
<iq:product id="d2air"/>
<iq:product id="d2airx10"/>
<iq:product id="d2delta"/>
<iq:product id="d2deltapx"/>
<iq:product id="d2deltas"/>
<iq:product id="d2mach1"/>
<iq:product id="descentg1"/>
<iq:product id="descentg2"/>
<iq:product id="descentmk1"/>
<iq:product id="descentmk2"/>
<iq:product id="descentmk2s"/>
<iq:product id="descentmk343mm"/>
<iq:product id="descentmk351mm"/>
<iq:product id="edge1030"/>
<iq:product id="edge1030bontrager"/>
<iq:product id="edge1030plus"/>
<iq:product id="edge1040"/>
<iq:product id="edge1050"/>
<iq:product id="edge520plus"/>
<iq:product id="edge530"/>
<iq:product id="edge540"/>
<iq:product id="edge820"/>
<iq:product id="edge830"/>
<iq:product id="edge840"/>
<iq:product id="edgeexplore"/>
<iq:product id="edgeexplore2"/>
<iq:product id="enduro"/>
<iq:product id="enduro3"/>
<iq:product id="epix2"/>
<iq:product id="epix2pro42mm"/>
<iq:product id="epix2pro47mm"/>
<iq:product id="epix2pro51mm"/>
<iq:product id="fenix5"/>
<iq:product id="fenix5plus"/>
<iq:product id="fenix5s"/>
<iq:product id="fenix5splus"/>
<iq:product id="fenix5x"/>
<iq:product id="fenix5xplus"/>
<iq:product id="fenix6"/>
<iq:product id="fenix6pro"/>
<iq:product id="fenix6s"/>
<iq:product id="fenix6spro"/>
<iq:product id="fenix6xpro"/>
<iq:product id="fenix7"/>
<iq:product id="fenix7pro"/>
<iq:product id="fenix7pronowifi"/>
<iq:product id="fenix7s"/>
<iq:product id="fenix7spro"/>
<iq:product id="fenix7x"/>
<iq:product id="fenix7xpro"/>
<iq:product id="fenix7xpronowifi"/>
<iq:product id="fenix843mm"/>
<iq:product id="fenix847mm"/>
<iq:product id="fenix8solar47mm"/>
<iq:product id="fenix8solar51mm"/>
<iq:product id="fenixchronos"/>
<iq:product id="fenixe"/>
<iq:product id="fr165"/>
<iq:product id="fr165m"/>
<iq:product id="fr245"/>
<iq:product id="fr245m"/>
<iq:product id="fr255"/>
<iq:product id="fr255m"/>
<iq:product id="fr255s"/>
<iq:product id="fr255sm"/>
<iq:product id="fr265"/>
<iq:product id="fr265s"/>
<iq:product id="fr55"/>
<iq:product id="fr57042mm"/>
<iq:product id="fr57047mm"/>
<iq:product id="fr645"/>
<iq:product id="fr645m"/>
<iq:product id="fr745"/>
<iq:product id="fr935"/>
<iq:product id="fr945"/>
<iq:product id="fr945lte"/>
<iq:product id="fr955"/>
<iq:product id="fr965"/>
<iq:product id="fr970"/>
<iq:product id="gpsmap66"/>
<iq:product id="gpsmap67"/>
<iq:product id="instinct2"/>
<iq:product id="instinct2s"/>
<iq:product id="instinct2x"/>
<iq:product id="instinct3amoled45mm"/>
<iq:product id="instinct3amoled50mm"/>
<iq:product id="instinct3solar45mm"/>
<iq:product id="instinctcrossover"/>
<iq:product id="instincte40mm"/>
<iq:product id="instincte45mm"/>
<iq:product id="legacyherocaptainmarvel"/>
<iq:product id="legacyherofirstavenger"/>
<iq:product id="legacysagadarthvader"/>
<iq:product id="legacysagarey"/>
<iq:product id="marq2"/>
<iq:product id="marq2aviator"/>
<iq:product id="marqadventurer"/>
<iq:product id="marqathlete"/>
<iq:product id="marqaviator"/>
<iq:product id="marqcaptain"/>
<iq:product id="marqcommander"/>
<iq:product id="marqdriver"/>
<iq:product id="marqexpedition"/>
<iq:product id="marqgolfer"/>
<iq:product id="montana7xx"/>
<iq:product id="venu"/>
<iq:product id="venu2"/>
<iq:product id="venu2plus"/>
<iq:product id="venu2s"/>
<iq:product id="venu3"/>
<iq:product id="venu3s"/>
<iq:product id="venud"/>
<iq:product id="venusq"/>
<iq:product id="venusq2"/>
<iq:product id="venusq2m"/>
<iq:product id="venusqm"/>
<iq:product id="vivoactive3"/>
<iq:product id="vivoactive3m"/>
<iq:product id="vivoactive3mlte"/>
<iq:product id="vivoactive4"/>
<iq:product id="vivoactive4s"/>
<iq:product id="vivoactive5"/>
<iq:product id="vivoactive6"/>
</iq:products>
<!--
Use "Monkey C: Edit Permissions" from the Visual Studio Code command
palette to update permissions.
-->
<iq:permissions>
<iq:uses-permission id="Background"/>
<iq:uses-permission id="BluetoothLowEnergy"/>
<iq:uses-permission id="Communications"/>
<iq:uses-permission id="Positioning"/>
</iq:permissions>
<!--
Use "Monkey C: Edit Languages" from the Visual Studio Code command
palette to edit your compatible language list.
-->
<iq:languages>
<iq:language>ara</iq:language>
<iq:language>bul</iq:language>
<iq:language>ces</iq:language>
<iq:language>dan</iq:language>
<iq:language>deu</iq:language>
<iq:language>dut</iq:language>
<iq:language>eng</iq:language>
<iq:language>est</iq:language>
<iq:language>fin</iq:language>
<iq:language>fre</iq:language>
<iq:language>gre</iq:language>
<iq:language>heb</iq:language>
<iq:language>hrv</iq:language>
<iq:language>hun</iq:language>
<iq:language>ind</iq:language>
<iq:language>ita</iq:language>
<iq:language>jpn</iq:language>
<iq:language>kor</iq:language>
<iq:language>lav</iq:language>
<iq:language>lit</iq:language>
<iq:language>nob</iq:language>
<iq:language>pol</iq:language>
<iq:language>por</iq:language>
<iq:language>ron</iq:language>
<!-- <iq:language>rus</iq:language> -->
<iq:language>slo</iq:language>
<iq:language>slv</iq:language>
<iq:language>spa</iq:language>
<iq:language>swe</iq:language>
<iq:language>tha</iq:language>
<iq:language>tur</iq:language>
<iq:language>ukr</iq:language>
<iq:language>vie</iq:language>
<iq:language>zhs</iq:language>
<iq:language>zht</iq:language>
<iq:language>zsm</iq:language>
</iq:languages>
<!--
Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
command palette to edit the included barrels.
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
to update the application attributes.
-->
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
<!--
Use the following from the Visual Studio Code command palette to edit
the build targets:
"Monkey C: Set Products by Product Category" - Lets you add all products
that belong to the same product category
"Monkey C: Edit Products" - Lets you add or remove any product
-->
<iq:products>
<iq:product id="approachs50"/>
<iq:product id="approachs7042mm"/>
<iq:product id="approachs7047mm"/>
<iq:product id="d2air"/>
<iq:product id="d2airx10"/>
<iq:product id="d2delta"/>
<iq:product id="d2deltapx"/>
<iq:product id="d2deltas"/>
<iq:product id="d2mach1"/>
<iq:product id="descentg1"/>
<iq:product id="descentg2"/>
<iq:product id="descentmk2"/>
<iq:product id="descentmk2s"/>
<iq:product id="descentmk343mm"/>
<iq:product id="descentmk351mm"/>
<iq:product id="edge1030"/>
<iq:product id="edge1030bontrager"/>
<iq:product id="edge1030plus"/>
<iq:product id="edge1040"/>
<iq:product id="edge1050"/>
<iq:product id="edge520plus"/>
<iq:product id="edge530"/>
<iq:product id="edge540"/>
<iq:product id="edge550"/>
<iq:product id="edge820"/>
<iq:product id="edge830"/>
<iq:product id="edge840"/>
<iq:product id="edge850"/>
<iq:product id="edgeexplore"/>
<iq:product id="edgeexplore2"/>
<iq:product id="edgemtb"/>
<iq:product id="enduro"/>
<iq:product id="enduro3"/>
<iq:product id="epix2"/>
<iq:product id="epix2pro42mm"/>
<iq:product id="epix2pro47mm"/>
<iq:product id="epix2pro47mmsystem7preview"/>
<iq:product id="epix2pro51mm"/>
<iq:product id="fenix5"/>
<iq:product id="fenix5plus"/>
<iq:product id="fenix5s"/>
<iq:product id="fenix5splus"/>
<iq:product id="fenix5x"/>
<iq:product id="fenix5xplus"/>
<iq:product id="fenix6"/>
<iq:product id="fenix6pro"/>
<iq:product id="fenix6s"/>
<iq:product id="fenix6spro"/>
<iq:product id="fenix6xpro"/>
<iq:product id="fenix7"/>
<iq:product id="fenix7pro"/>
<iq:product id="fenix7pronowifi"/>
<iq:product id="fenix7s"/>
<iq:product id="fenix7spro"/>
<iq:product id="fenix7x"/>
<iq:product id="fenix7xpro"/>
<iq:product id="fenix7xpronowifi"/>
<iq:product id="fenix843mm"/>
<iq:product id="fenix847mm"/>
<iq:product id="fenix8pro47mm"/>
<iq:product id="fenix8solar47mm"/>
<iq:product id="fenix8solar51mm"/>
<iq:product id="fenixchronos"/>
<iq:product id="fenixe"/>
<iq:product id="fr165"/>
<iq:product id="fr165m"/>
<iq:product id="fr245"/>
<iq:product id="fr245m"/>
<iq:product id="fr255"/>
<iq:product id="fr255m"/>
<iq:product id="fr255s"/>
<iq:product id="fr255sm"/>
<iq:product id="fr265"/>
<iq:product id="fr265s"/>
<iq:product id="fr55"/>
<iq:product id="fr57042mm"/>
<iq:product id="fr57047mm"/>
<iq:product id="fr645"/>
<iq:product id="fr645m"/>
<iq:product id="fr745"/>
<iq:product id="fr935"/>
<iq:product id="fr945"/>
<iq:product id="fr945lte"/>
<iq:product id="fr955"/>
<iq:product id="fr965"/>
<iq:product id="fr970"/>
<iq:product id="gpsmap66"/>
<iq:product id="gpsmap67"/>
<iq:product id="gpsmaph1"/>
<iq:product id="instinct2"/>
<iq:product id="instinct2s"/>
<iq:product id="instinct2x"/>
<iq:product id="instinct3amoled45mm"/>
<iq:product id="instinct3amoled50mm"/>
<iq:product id="instinct3solar45mm"/>
<iq:product id="instinctcrossover"/>
<iq:product id="instinctcrossoveramoled"/>
<iq:product id="instincte40mm"/>
<iq:product id="instincte45mm"/>
<iq:product id="legacyherocaptainmarvel"/>
<iq:product id="legacyherofirstavenger"/>
<iq:product id="legacysagadarthvader"/>
<iq:product id="legacysagarey"/>
<iq:product id="marq2"/>
<iq:product id="marq2aviator"/>
<iq:product id="marqadventurer"/>
<iq:product id="marqathlete"/>
<iq:product id="marqaviator"/>
<iq:product id="marqcaptain"/>
<iq:product id="marqcommander"/>
<iq:product id="marqdriver"/>
<iq:product id="marqexpedition"/>
<iq:product id="marqgolfer"/>
<iq:product id="montana7xx"/>
<iq:product id="venu"/>
<iq:product id="venu2"/>
<iq:product id="venu2plus"/>
<iq:product id="venu2s"/>
<iq:product id="venu3"/>
<iq:product id="venu3s"/>
<iq:product id="venu441mm"/>
<iq:product id="venu445mm"/>
<iq:product id="venud"/>
<iq:product id="venusq"/>
<iq:product id="venusq2"/>
<iq:product id="venusq2m"/>
<iq:product id="venusqm"/>
<iq:product id="venux1"/>
<iq:product id="vivoactive3"/>
<iq:product id="vivoactive3m"/>
<iq:product id="vivoactive3mlte"/>
<iq:product id="vivoactive4"/>
<iq:product id="vivoactive4s"/>
<iq:product id="vivoactive5"/>
<iq:product id="vivoactive6"/>
</iq:products>
<!--
Use "Monkey C: Edit Permissions" from the Visual Studio Code command
palette to update permissions.
-->
<iq:permissions>
<iq:uses-permission id="Background"/>
<iq:uses-permission id="BluetoothLowEnergy"/>
<iq:uses-permission id="Communications"/>
<iq:uses-permission id="Positioning"/>
</iq:permissions>
<!--
Use "Monkey C: Edit Languages" from the Visual Studio Code command
palette to edit your compatible language list.
-->
<iq:languages>
<iq:language>ara</iq:language>
<iq:language>bul</iq:language>
<iq:language>ces</iq:language>
<iq:language>dan</iq:language>
<iq:language>deu</iq:language>
<iq:language>dut</iq:language>
<iq:language>eng</iq:language>
<iq:language>est</iq:language>
<iq:language>fin</iq:language>
<iq:language>fre</iq:language>
<iq:language>gre</iq:language>
<iq:language>heb</iq:language>
<iq:language>hrv</iq:language>
<iq:language>hun</iq:language>
<iq:language>ind</iq:language>
<iq:language>ita</iq:language>
<iq:language>jpn</iq:language>
<iq:language>kor</iq:language>
<iq:language>lav</iq:language>
<iq:language>lit</iq:language>
<iq:language>nob</iq:language>
<iq:language>pol</iq:language>
<iq:language>por</iq:language>
<iq:language>ron</iq:language>
<!-- <iq:language>rus</iq:language> -->
<iq:language>slo</iq:language>
<iq:language>slv</iq:language>
<iq:language>spa</iq:language>
<iq:language>swe</iq:language>
<iq:language>tha</iq:language>
<iq:language>tur</iq:language>
<iq:language>ukr</iq:language>
<iq:language>vie</iq:language>
<iq:language>zhs</iq:language>
<iq:language>zht</iq:language>
<iq:language>zsm</iq:language>
</iq:languages>
<!--
Use "Monkey C: Configure Monkey Barrel" from the Visual Studio Code
command palette to edit the included barrels.
-->
<iq:barrels/>
</iq:application>
</iq:manifest>

View File

@@ -20,7 +20,7 @@ project.manifest = manifest.xml
# Device References
# * https://developer.garmin.com/connect-iq/compatible-devices/
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/
# * https://developer.garmin.com/connect-iq/device-reference/
#
# Widget launcher icon, multiple resolutions
# https://forums.garmin.com/developer/connect-iq/f/discussion/255433/widget-launcher-icon-multiple-resolutions/1563305
@@ -77,14 +77,20 @@ edge520plus.resourcePath = $(edge520plus.resourcePath);resources-launcher-35-35;
# Screen Size 246x322 launcher icon size 35x35
edge530.resourcePath = $(edge530.resourcePath);resources-launcher-35-35;resources-icons-28
edge540.resourcePath = $(edge540.resourcePath);resources-launcher-35-35;resources-icons-28
# Screen Size 420x600 launcher icon size 56x56
edge550.resourcePath = $(edge550.resourcePath);resources-launcher-56-56;resources-icons-55
# Screen Size 200x265 launcher icon size 35x35
edge820.resourcePath = $(edge820.resourcePath);resources-launcher-35-35;resources-icons-24
# Screen Size 246x322 launcher icon size 35x35
edge830.resourcePath = $(edge830.resourcePath);resources-launcher-35-35;resources-icons-28
edge840.resourcePath = $(edge840.resourcePath);resources-launcher-35-35;resources-icons-28
# Screen Size 420x600 launcher icon size 56x56
edge850.resourcePath = $(edge850.resourcePath);resources-launcher-56-56;resources-icons-55
# Screen Size 240x400 launcher icon size 36x36
edgeexplore.resourcePath = $(edgeexplore.resourcePath);resources-launcher-36-36;resources-icons-28
edgeexplore2.resourcePath = $(edgeexplore2.resourcePath);resources-launcher-36-36;resources-icons-28
# Screen Size 240x320 launcher icon size 36x36
edgemtb.resourcePath = $(edgemtb.resourcePath);resources-launcher-36-36;resources-icons-32
# Screen Size 280x280 launcher icon size 40x40
enduro.resourcePath = $(enduro.resourcePath);resources-launcher-40-40;resources-icons-32
enduro3.resourcePath = $(enduro3.resourcePath);resources-launcher-40-40;resources-icons-32
@@ -128,6 +134,7 @@ fenix7xpronowifi.resourcePath = $(fenix7xpronowifi.resourcePath);resources-launc
fenix843mm.resourcePath = $(fenix843mm.resourcePath);resources-launcher-60-60;resources-icons-48
# Screen Size 454x454 launcher icon size 65x65
fenix847mm.resourcePath = $(fenix847mm.resourcePath);resources-launcher-65-65;resources-icons-53
fenix8pro47mm.resourcePath = $(fenix8pro47mm.resourcePath);resources-launcher-65-65;resources-icons-53
# Screen Size 260x260 launcher icon size 40x40
fenix8solar47mm.resourcePath = $(fenix8solar47mm.resourcePath);resources-launcher-40-40;resources-icons-30
# Screen Size 280x280 launcher icon size 40x40
@@ -136,7 +143,7 @@ fenix8solar51mm.resourcePath = $(fenix8solar51mm.resourcePath);resources-launche
fenixchronos.resourcePath = $(fenixchronos.resourcePath);resources-launcher-36-36;resources-icons-26
# Screen Size 416x416 launcher icon size 60x60
fenixe.resourcePath = $(fenixe.resourcePath);resources-launcher-60-60;resources-icons-48
# Screen Size 390 x 390 launcher icon size 54x54
# Screen Size 390x390 launcher icon size 54x54
fr165.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46
fr165m.resourcePath = $(descentmk2s.resourcePath);resources-launcher-54-54;resources-icons-46
# Screen Size 240x240 launcher icon size 40x40
@@ -173,6 +180,7 @@ fr970.resourcePath = $(fr970.resourcePath);resources-launcher-65-65;resources-ic
# Screen Size 240x400 launcher icon size 38x33
gpsmap66.resourcePath = $(gpsmap66.resourcePath);resources-launcher-33-33;resources-icons-28
gpsmap67.resourcePath = $(gpsmap67.resourcePath);resources-launcher-33-33;resources-icons-28
gpsmaph1.resourcePath = $(gpsmaph1.resourcePath);resources-launcher-33-33;resources-icons-28
# Screen Size 176x176 launcher icon size 62x62
instinct2.resourcePath = $(instinct2.resourcePath);resources-launcher-62-62;resources-icons-21-w
# Screen Size 163x156 launcher icon size 54x54
@@ -187,6 +195,8 @@ instinct3amoled50mm.resourcePath = $(instinct3amoled50mm.resourcePath);resources
instinct3solar45mm.resourcePath = $(instinct3solar45mm.resourcePath);resources-launcher-62-62;resources-icons-18-w
# Screen Size 176x176 launcher icon size 26x26
instinctcrossover.resourcePath = $(instinctcrossover.resourcePath);resources-launcher-26-26;resources-icons-21-w
# Screen Size 390x390 launcher icon size 38x38
instinctcrossoveramoled.resourcePath = $(instinctcrossoveramoled.resourcePath);resources-launcher-38-38;resources-icons-46
# Screen Size 166x166 launcher icon size 52x52, but the icon size used here is reduced as the menu items were clipped.
instincte40mm.resourcePath = $(instincte40mm.resourcePath);resources-launcher-52-52;resources-icons-18-w
# Screen Size 176x176 launcher icon size 62x62, but the icon size used here is reduced as the menu items were clipped.
@@ -223,6 +233,10 @@ venu2s.resourcePath = $(venu2s.resourcePath);resources-launcher-61-61;resources-
venu3.resourcePath = $(venu3.resourcePath);resources-launcher-70-70;resources-icons-53
# Screen Size 390x390 launcher icon size 70x70
venu3s.resourcePath = $(venu3s.resourcePath);resources-launcher-70-70;resources-icons-46
# Screen Size 390x390 launcher icon size 54x54
venu441mm.resourcePath = $(venu441mm.resourcePath);resources-launcher-54-54;resources-icons-46
# Screen Size 454x454 launcher icon size 65x65
venu445mm.resourcePath = $(venu445mm.resourcePath);resources-launcher-65-65;resources-icons-53
# Screen Size 390x390 launcher icon size 60x60
venud.resourcePath = $(venud.resourcePath);resources-launcher-60-60;resources-icons-46
# Screen Size 240x240 launcher icon size 36x36
@@ -232,6 +246,8 @@ venusq2.resourcePath = $(venusq2.resourcePath);resources-launcher-40-40;resource
venusq2m.resourcePath = $(venusq2m.resourcePath);resources-launcher-40-40;resources-icons-38
# Screen Size 240x240 launcher icon size 36x36
venusqm.resourcePath = $(venusqm.resourcePath);resources-launcher-36-36;resources-icons-28
# Screen Size 448x486 launcher icon size 65x65
venux1.resourcePath = $(venux1.resourcePath);resources-launcher-65-65;resources-icons-53
# Screen Size 240x240 launcher icon size 40x33
vivoactive3.resourcePath = $(vivoactive3.resourcePath);resources-launcher-33-33;resources-icons-28
vivoactive3m.resourcePath = $(vivoactive3m.resourcePath);resources-launcher-33-33;resources-icons-28

View File

@@ -14,70 +14,88 @@
-->
<!--
Generated by Google Translate: English to Arabic
تم إنشاؤه بواسطة Google Translate من اللغة الإنجليزية
Generated by Google Translate and gemini-2.5-flash from English to Arabic
تم الإنشاء بواسطة ترجمة جوجل و gemini-2.5-flash من الإنجليزية إلى العربية
-->
<strings>
<string id="ApiFlood">API يدعو سريع للغاية. يرجى إبطاء طلباتك.</string>
<string id="ApiUrlNotFound">URL لم يتم العثور عليه. خطأ URL API المحتمل في الإعدادات.</string>
<string id="ApiFlood">مكالمات API سريعة للغاية. يرجى إبطاء طلباتك.</string>
<string id="ApiUrlNotFound">لم يتم العثور على عنوان URL. قد يكون هناك خطأ في عنوان URL الخاص بـ
API في الإعدادات.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">متاح</string>
<string id="Cached" scope="glance">مخبأة</string>
<string id="Cached" scope="glance">مخزّن مؤقتًا</string>
<string id="Checking" scope="glance">التحقق ...</string>
<string id="ConfigUrlNotFound">URL لم يتم العثور عليه. خطأ في عنوان URL التكوين المحتمل في الإعدادات.</string>
<string id="ConfigUrlNotFound">لم يتم العثور على عنوان URL. قد يكون هناك خطأ في عنوان URL الخاص
بالتكوين في الإعدادات.</string>
<string id="Confirm">بالتأكيد؟</string>
<string id="Empty">فارغ</string>
<string id="Executed" scope="glance">مؤكد</string>
<string id="GlanceMenu" scope="glance">قائمة طعام</string>
<string id="GlanceMenu" scope="glance">قائمة</string>
<string id="Memory" scope="glance">ذاكرة</string>
<string id="NoAPIKey" scope="glance">لا مفتاح API في إعدادات التطبيق.</string>
<string id="NoApiUrl" scope="glance">لا عنوان URL API في إعدادات التطبيق.</string>
<string id="MenuUpdated">تم تحديث القائمة، أعد التشغيل.</string>
<string id="MenuCheckDisabled">تم تعطيل تحديثات القائمة.</string>
<string id="NoAPIKey" scope="glance">لا يوجد مفتاح API في إعدادات التطبيق.</string>
<string id="NoApiUrl" scope="glance">لا يوجد عنوان URL لـ API في إعدادات التطبيق.</string>
<string id="NoConfigUrl" scope="glance">لا يوجد عنوان URL للتكوين في إعدادات التطبيق.</string>
<string id="NoInternet">لا اتصال إنترنت.</string>
<string id="NoInternet">لا يوجد اتصال بالإنترنت.</string>
<string id="NoJson">لم يتم إرجاع أي JSON من طلب HTTP.</string>
<string id="NoPhone" scope="glance">لا يوجد اتصال هاتفي.</string>
<string id="NoPhoneNoCache" scope="glance">لا اتصال الهاتف ، لا توجد قائمة مخبأة.</string>
<string id="NoResponse">لا استجابة ، تحقق من اتصال الإنترنت</string>
<string id="TimedOut">طلب توقيت الخروج</string>
<string id="PinInputLocked">دبوس إدخال مغلق ل</string>
<string id="NoPhoneNoCache" scope="glance">لا يوجد اتصال بالهاتف، لا توجد قائمة مخزنة مؤقتًا.</string>
<string id="NoResponse">لا توجد استجابة، تحقق من اتصال الإنترنت.</string>
<string id="TimedOut">انتهت مهلة الطلب</string>
<string id="PinInputLocked">إدخال رمز PIN مغلق لمدة</string>
<string id="PotentialError">خطأ محتمل</string>
<string id="Seconds">ثوان</string>
<string id="TemplateError">خطأ قالب</string>
<string id="TrailingSlashErr">يجب ألا يكون URL url API مائلة زائدة "/".</string>
<string id="TrailingSlashErr">يجب ألا يحتوي عنوان URL الخاص بـ API على شرطة مائلة في النهاية '/'.</string>
<string id="Unavailable" scope="glance">غير متاح</string>
<string id="Unconfigured" scope="glance">غير متكافئ</string>
<string id="UnhandledHttpErr">طلب HTTP رمز الخطأ الذي تم إرجاعه =</string>
<string id="WebhookFailed">فشل في تسجيل webhook</string>
<string id="WrongPin">دبوس خاطئ</string>
<string id="WifiLteNotAvailable">لا متوفر Wi-Fi أو LTE</string>
<string id="WifiLtePrompt">تنفيذ على Wi-Fi/LTE؟</string>
<string id="WifiLteExecutionTitle">إرسال إلى المنزل مساعد.</string>
<string id="Unconfigured" scope="glance">غير مهيأ</string>
<string id="UnhandledHttpErr">أرجع طلب HTTP رمز الخطأ =</string>
<string id="WebhookFailed">فشل في تسجيل Webhook</string>
<string id="WrongPin">رمز PIN خاطئ</string>
<string id="WifiLteNotAvailable">لا يتوفر Wi-Fi أو LTE</string>
<string id="WifiLtePrompt">التنفيذ عبر Wi-Fi/LTE؟</string>
<string id="WifiLteExecutionTitle">إرسال إلى Home Assistant.</string>
<string id="WifiLteExecutionDataError">لم يتم استلام البيانات.</string>
<!-- بالنسبة للإعدادات واجهة المستخدم الرسومية ، يجب أن تكون السلاسل بالترتيب المستخدمة. -->
<string id="SettingsSelect">يختار...</string>
<string id="SettingsApiKey">مفتاح API للمثليين.</string>
<string id="SettingsApiKeyPrompt">رمز الوصول منذ فترة طويلة.</string>
<string id="SettingsApiUrl">عنوان URL لـ HereasSistant API.</string>
<string id="SettingsSelect">تحديد...</string>
<string id="SettingsApiKey">مفتاح API لـ HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">رمز وصول طويل الأمد.</string>
<string id="SettingsApiUrl">عنوان URL لـ HomeAssistant API.</string>
<string id="SettingsConfigUrl">عنوان URL لتكوين القائمة (JSON).</string>
<string id="SettingsCacheConfig">هل يجب أن يقوم تطبيق ذاكرة التخزين المؤقت لتكوين القائمة؟</string>
<string id="SettingsClearCache">هل يجب على التطبيق مسح ذاكرة التخزين المؤقت الموجودة في المرة القادمة التي يتم فيها بدء تشغيلها؟</string>
<string id="WifiLteExecutionEnable">تمكين تنفيذ الأوامر على Wi-Fi/LTE.</string>
<string id="SettingsVibration">هل يجب أن يقدم التطبيق ملاحظات عبر الاهتزازات؟</string>
<string id="SettingsAppTimeout">مهلة في ثوان. الخروج من التطبيق بعد هذه الفترة من عدم النشاط لحفظ بطارية الجهاز.</string>
<string id="SettingsPollDelay">تأخير استطلاع إضافي (بالثواني). يضيف تأخيرًا بين تحديث الحالة لجميع عناصر القائمة.</string>
<string id="SettingsConfirmTimeout">بعد هذا الوقت (بالثواني) ، يتم إغلاق مربع حوار تأكيد لإجراء ما ويتم إلغاء الإجراء. ضبط على 0 لتعطيل المهلة.</string>
<string id="SettingsPin">دبوس من 4 أرقام لاستخدامه في جميع الإجراءات التي تتطلب ذلك (0000-9999).</string>
<string id="SettingsPinError">يرجى تكوين دبوس رقمي مكون من 4 أرقام بين 0000 و 9999 في إعدادات التطبيق.</string>
<string id="SettingsTextAlign">اليسار (قبالة) أو محاذاة القائمة اليمنى (ON).</string>
<string id="LeftToRight">من اليسار إلى اليمين</string>
<string id="RightToLeft">من اليمين إلى اليسار</string>
<string id="SettingsWidgetStart">(عنصر واجهة المستخدم فقط) ابدأ التطبيق تلقائيًا من عنصر واجهة المستخدم دون انتظار النقر.</string>
<string id="SettingsEnableBatteryLevel">قم بتمكين خدمة الخلفية لإرسال مستوى بطارية الجهاز والموقع و (إذا كان مدعومًا) بيانات النشاط إلى مساعد المنزل.</string>
<string id="SettingsBatteryLevelRefreshRate">معدل التحديث (في الدقائق) التي يجب أن تكرر خدمة الخلفية إرسال البيانات.</string>
<string id="SettingsUserHttpHeader">قام المستخدم بتزويد المستخدم HTTP</string>
<string id="SettingsUserHttpHeaderDescription">تتطلب بعض عمليات تثبيت المساعدين المنزلي مواصفات رأس HTTP مخصص من أجل العمل.</string>
<string id="SettingsUserHttpHeaderName">قام المستخدم بتزويد HTTP Header: الاسم</string>
<string id="SettingsUserHttpHeaderValue">قام المستخدم بتزويد HTTP Header: Value</string>
<string id="WebhookId">(اقرأ فقط) معرف WebHook الذي تم إنشاؤه بواسطة الجهاز لتحديثات خدمة الخلفية. قد تطلب هذا لتصحيح الأخطاء.</string>
<string id="SettingsCacheConfig">هل يجب على التطبيق تخزين تكوين القائمة مؤقتًا؟</string>
<string id="SettingsClearCache">هل يجب على التطبيق مسح ذاكرة التخزين المؤقت الموجودة في المرة
القادمة التي يتم فيها بدء تشغيلها؟</string>
<string id="SettingsEnableMenuUpdateCheck">التحقق من تحديثات القائمة عند بدء تشغيل التطبيق؟ ملاحظة: يجب تمكين تخزين القائمة مؤقتًا. قد يتسبب هذا الإعداد في تعطل الأجهزة القديمة ذات الذاكرة الأقل.</string>
<string id="SettingsWifiLteExecutionEnable">تمكين تنفيذ الأوامر عبر Wi-Fi/LTE.</string>
<string id="SettingsVibration">هل يجب أن يوفر التطبيق تغذية راجعة عبر الاهتزازات؟</string>
<string id="SettingsAppTimeout">مهلة بالثواني. يتم الخروج من التطبيق بعد هذه الفترة من عدم النشاط
لحفظ بطارية الجهاز.</string>
<string id="SettingsPollDelay">تأخير استطلاع إضافي (بالثواني). يضيف تأخيرًا بين تحديث الحالة لجميع
عناصر القائمة.</string>
<string id="SettingsConfirmTimeout">بعد هذا الوقت (بالثواني)، يتم إغلاق مربع حوار تأكيد لإجراء ما
تلقائيًا ويتم إلغاء الإجراء. اضبط على 0 لتعطيل المهلة.</string>
<string id="SettingsPin">رمز PIN مكون من 4 أرقام لاستخدامه في جميع الإجراءات التي تتطلب ذلك
(0000-9999).</string>
<string id="SettingsPinError">يرجى تكوين رمز PIN رقمي مكون من 4 أرقام بين 0000 و 9999 في إعدادات
التطبيق.</string>
<string id="SettingsTextAlign">محاذاة القائمة: لليسار (إيقاف) أو لليمين (تشغيل).</string>
<string id="SettingsLeftToRight">من اليسار إلى اليمين</string>
<string id="SettingsRightToLeft">من اليمين إلى اليسار</string>
<string id="SettingsWidgetStart">(عنصر واجهة المستخدم فقط) ابدأ التطبيق تلقائيًا من عنصر واجهة
المستخدم دون انتظار النقر.</string>
<string id="SettingsEnableBatteryLevel">تمكين خدمة الخلفية لإرسال مستوى بطارية الجهاز والموقع
وبيانات النشاط (إذا كانت مدعومة) إلى Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">معدل التحديث (بالدقائق) الذي يجب أن تكرر فيه خدمة
الخلفية إرسال البيانات.</string>
<string id="SettingsUserHttpHeader">رأس HTTP مقدم من المستخدم</string>
<string id="SettingsUserHttpHeaderDescription">تتطلب بعض عمليات تثبيت Home Assistant تحديد رأس
HTTP مخصص لكي تعمل.</string>
<string id="SettingsUserHttpHeaderName">رأس HTTP مقدم من المستخدم: الاسم</string>
<string id="SettingsUserHttpHeaderValue">رأس HTTP مقدم من المستخدم: القيمة</string>
<string id="SettingsClearWebhookId">أعد الاتصال بـ Home Assistant (مسح معرف Webhook، انظر دليل
استكشاف الأخطاء وإصلاحها).</string>
<string id="SettingsWebhookId">(للقراءة فقط) معرف Webhook الذي تم إنشاؤه بواسطة الجهاز لتحديثات
خدمة الخلفية. قد تحتاج هذا لتصحيح الأخطاء.</string>
</strings>

View File

@@ -14,70 +14,74 @@
-->
<!--
Generated by Google Translate: English to Bulgarian
Генериран от Google Translate от английски
Generated by Google Translate and gemini-2.5-flash from English to Bulgarian
Генерирано от Google Translate и gemini-2.5-flash от английски на български
-->
<strings>
<string id="ApiFlood">API се обажда твърде бързо. Моля, забавете заявките си.</string>
<string id="ApiFlood">API повикванията са твърде чести. Моля, забавете заявките си.</string>
<string id="ApiUrlNotFound">URL адрес не е намерен. Потенциална грешка в URL адреса на API в настройките.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">На разположение</string>
<string id="Cached" scope="glance">Кеширан</string>
<string id="Checking" scope="glance">Проверка ...</string>
<string id="ConfigUrlNotFound">URL адрес не е намерен. Потенциална грешка в URL адрес на конфигурация в настройките.</string>
<string id="ConfigUrlNotFound">URL адрес не е намерен. Възможна грешка в URL адреса за конфигурация в настройките.</string>
<string id="Confirm">Сигурно?</string>
<string id="Empty">Празен</string>
<string id="Executed" scope="glance">Потвърдено</string>
<string id="GlanceMenu" scope="glance">Меню</string>
<string id="Memory" scope="glance">Памет</string>
<string id="MenuUpdated">Менюто е обновено, рестартирайте.</string>
<string id="MenuCheckDisabled">Актуализациите на менюто са деактивирани.</string>
<string id="NoAPIKey" scope="glance">Няма ключ за 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="NoInternet">Няма интернет връзка.</string>
<string id="NoJson">Нито един JSON се върна от HTTP заявка.</string>
<string id="NoJson">Не е върнат JSON от HTTP заявка.</string>
<string id="NoPhone" scope="glance">Няма телефонна връзка.</string>
<string id="NoPhoneNoCache" scope="glance">Без телефонна връзка, без кеширано меню.</string>
<string id="NoResponse">Без отговор, проверете интернет връзката</string>
<string id="NoPhoneNoCache" scope="glance">Няма телефонна връзка, няма кеширано меню.</string>
<string id="NoResponse">Няма отговор, проверете интернет връзката.</string>
<string id="TimedOut">Заявка изтече</string>
<string id="PinInputLocked">ПИН вход, заключен за</string>
<string id="PinInputLocked">Въвеждането на ПИН е заключено за</string>
<string id="PotentialError">Потенциална грешка</string>
<string id="Seconds">секунди</string>
<string id="TemplateError">Грешка в шаблона</string>
<string id="TrailingSlashErr">URL адресът на API не трябва да има закъснение '/'.</string>
<string id="TrailingSlashErr">URL адресът на API не трябва да завършва с наклонена черта '/'.</string>
<string id="Unavailable" scope="glance">Недостъпни</string>
<string id="Unconfigured" scope="glance">Неуверен</string>
<string id="UnhandledHttpErr">HTTP заявка Върната код за грешка =</string>
<string id="WebhookFailed">Не успя да регистрира WebHook</string>
<string id="WrongPin">Грешен щифт</string>
<string id="Unconfigured" scope="glance">Неконфигуриран</string>
<string id="UnhandledHttpErr">HTTP заявката върна код за грешка = </string>
<string id="WebhookFailed">Неуспешна регистрация на Webhook</string>
<string id="WrongPin">Грешен ПИН</string>
<string id="WifiLteNotAvailable">Няма налични Wi-Fi или LTE</string>
<string id="WifiLtePrompt">Изпълнете над Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Изпращане до домашен асистент.</string>
<string id="WifiLteExecutionTitle">Изпращане до Home Assistant.</string>
<string id="WifiLteExecutionDataError">Няма получени данни.</string>
<!-- За GUI на настройките, низовете трябва да са в реда, в който се използват. -->
<string id="SettingsSelect">Изберете ...</string>
<string id="SettingsApiKey">Ключ на API за домашно.</string>
<string id="SettingsApiKey">API ключ за Home Assistant.</string>
<string id="SettingsApiKeyPrompt">Дълготраен маркер за достъп.</string>
<string id="SettingsApiUrl">URL за домашен API.</string>
<string id="SettingsApiUrl">URL за Home Assistant API.</string>
<string id="SettingsConfigUrl">URL за конфигуриране на менюто (JSON).</string>
<string id="SettingsCacheConfig">Трябва ли приложението да кешира конфигурацията на менюто?</string>
<string id="SettingsClearCache">Трябва ли приложението да изчисти съществуващия кеш следващия път, когато е стартиран?</string>
<string id="WifiLteExecutionEnable">Активиране на изпълнение на команди над Wi-Fi/LTE.</string>
<string id="SettingsClearCache">Трябва ли приложението да изчисти съществуващия кеш следващия път, когато бъде стартирано?</string>
<string id="SettingsEnableMenuUpdateCheck">Проверка за актуализации на менюто при стартиране на приложението? Забележка: Кеширането на менюто трябва да е активирано. Тази настройка може да доведе до срив на по-стари устройства с по-малко памет.</string>
<string id="SettingsWifiLteExecutionEnable">Активиране на изпълнение на команди над Wi-Fi/LTE.</string>
<string id="SettingsVibration">Трябва ли приложението да предоставя обратна връзка чрез вибрации?</string>
<string id="SettingsAppTimeout">Време за изчакване за секунди. Излезте от приложението след този период на бездействие, за да запазите батерията на устройството.</string>
<string id="SettingsPollDelay">Допълнително забавяне на анкетата (за секунди). Добавя забавяне между актуализацията на състоянието на всички елементи от менюто.</string>
<string id="SettingsConfirmTimeout">След това време (за секунди) диалоговият прозорец за потвърждение за действие автоматично се затваря и действието се отменя. Задайте 0, за да деактивирате изчакване.</string>
<string id="SettingsAppTimeout">Време за изчакване в секунди. Излезте от приложението след този период на бездействие, за да запазите батерията на устройството.</string>
<string id="SettingsPollDelay">Допълнително забавяне на опресняването секунди). Добавя забавяне между актуализацията на състоянието на всички елементи от менюто.</string>
<string id="SettingsConfirmTimeout">След това време (в секунди) диалоговият прозорец за потвърждение за действие автоматично се затваря и действието се отменя. Задайте на 0, за да деактивирате изчакването.</string>
<string id="SettingsPin">4-цифрен ПИН, който ще се използва за всички действия, които го изискват (0000-9999).</string>
<string id="SettingsPinError">Моля, конфигурирайте валиден 4-цифрен цифров ПИН между 0000 и 9999 в настройките на приложението.</string>
<string id="SettingsTextAlign">Наляво (изключено) или вдясно (включено) изравняване на менюто.</string>
<string id="LeftToRight">Отляво надясно</string>
<string id="RightToLeft">Отдясно наляво</string>
<string id="SettingsWidgetStart">(Само при джаджа) Автоматично стартирайте приложението от джаджата, без да чакате докосване.</string>
<string id="SettingsEnableBatteryLevel">Активирайте фоновата услуга за изпращане на нивото на батерията на устройството, местоположението и (ако се поддържа) данни за активност на домашен асистент.</string>
<string id="SettingsBatteryLevelRefreshRate">Скоростта на опресняване (за минути), при която фоновата услуга трябва да повтори изпращането на данни.</string>
<string id="SettingsUserHttpHeader">Потребител, доставен HTTP заглавка</string>
<string id="SettingsUserHttpHeaderDescription">Някои инсталации за домашен асистент изискват спецификация на персонализиран HTTP заглавка, за да функционират.</string>
<string id="SettingsUserHttpHeaderName">Потребител, доставен http-header: Име</string>
<string id="SettingsUserHttpHeaderValue">Потребител, доставен http-header: стойност</string>
<string id="WebhookId">(Само прочетете) Идентификационният номер на WebHook, създаден от устройството за актуализации на фоновите услуги. Може да се наложи това за отстраняване на грешки.</string>
<string id="SettingsLeftToRight">Отляво надясно</string>
<string id="SettingsRightToLeft">Отдясно наляво</string>
<string id="SettingsWidgetStart">(Само при джаджа) Приложението се стартира автоматично от джаджата, без да се чака докосване.</string>
<string id="SettingsEnableBatteryLevel">Активиране на фоновата услуга за изпращане на нивото на батерията на устройството, местоположението и (ако се поддържа) данни за активност към Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Скоростта на опресняване (в минути), при която фоновата услуга трябва да повтаря изпращането на данни.</string>
<string id="SettingsUserHttpHeader">Потребителска HTTP заглавка</string>
<string id="SettingsUserHttpHeaderDescription">Някои инсталации на Home Assistant изискват специфицирането на персонализирана HTTP заглавка, за да функционират.</string>
<string id="SettingsUserHttpHeaderName">Потребителска HTTP заглавка: Име</string>
<string id="SettingsUserHttpHeaderValue">Потребителска HTTP заглавка: Стойност</string>
<string id="SettingsClearWebhookId">Свържете се отново с Home Assistant (изчистване на Webhook ID, вижте ръководството за отстраняване на неизправности).</string>
<string id="SettingsWebhookId">(Само за четене) Webhook ID, създаден от устройството за актуализации на фоновите услуги. Може да ви е необходим за отстраняване на грешки.</string>
</strings>

View File

@@ -14,12 +14,12 @@
-->
<!--
Generated by Google Translate: English to Czech
Generováno překladem Google z angličtiny
Generated by Google Translate and gemini-2.5-flash from English to Czech
Vygenerováno pomocí Google Translate a gemini-2.5-flash z angličtiny do češtiny
-->
<strings>
<string id="ApiFlood">API volá příliš rychlé. Prosím, zpomalte své požadavky.</string>
<string id="ApiFlood">Volání API jsou příliš rychlá. Prosím, zpomalte své požadavky.</string>
<string id="ApiUrlNotFound">URL nebyla nalezena. Potenciální chyba URL API v nastavení.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Dostupné</string>
@@ -31,16 +31,18 @@
<string id="Executed" scope="glance">Potvrzeno</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<string id="Memory" scope="glance">Paměť</string>
<string id="MenuUpdated">Menu aktualizováno, restartujte.</string>
<string id="MenuCheckDisabled">Aktualizace menu zakázány.</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="NoConfigUrl" scope="glance">V nastavení aplikace není žádná konfigurační adresa URL.</string>
<string id="NoConfigUrl" scope="glance">Žádná konfigurační URL v nastavení aplikace.</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="NoPhone" scope="glance">Žádné telefonní připojení.</string>
<string id="NoPhoneNoCache" scope="glance">Žádné připojení telefonu, žádné menu v mezipaměti.</string>
<string id="NoResponse">Žádná odpověď, zkontrolovat připojení k internetu</string>
<string id="TimedOut">Požadavek načasovaný</string>
<string id="PinInputLocked">Vstup kolíku uzamčený pro</string>
<string id="NoResponse">Žádná odpověď, zkontrolujte připojení k internetu.</string>
<string id="TimedOut">Vypršel časový limit požadavku.</string>
<string id="PinInputLocked">Vstup PIN uzamčen na</string>
<string id="PotentialError">Potenciální chyba</string>
<string id="Seconds">sekundy</string>
<string id="TemplateError">Chyba šablony</string>
@@ -49,35 +51,37 @@
<string id="Unconfigured" scope="glance">Nekonfigurované</string>
<string id="UnhandledHttpErr">HTTP požadavek vrátil chybový kód =</string>
<string id="WebhookFailed">Nepodařilo se zaregistrovat Webhook</string>
<string id="WrongPin">Špatný špendlík</string>
<string id="WrongPin">Špatný PIN</string>
<string id="WifiLteNotAvailable">Není k dispozici žádné Wi-Fi nebo LTE</string>
<string id="WifiLtePrompt">Provést přes Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Odeslá domácímu asistentovi.</string>
<string id="WifiLteExecutionDataError">Žádná data.</string>
<string id="WifiLteExecutionTitle">Odesím do Home Assistant.</string>
<string id="WifiLteExecutionDataError">Nebyla přijata žádná data.</string>
<!-- Pro GUI nastavení by měly být řetězce v pořadí, které jsou použity. -->
<string id="SettingsSelect">Vybrat...</string>
<string id="SettingsApiKey">Klíč API pro domácí.</string>
<string id="SettingsApiKey">Klíč API pro HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Dlouhodobý přístupový token.</string>
<string id="SettingsApiUrl">URL pro domácí API.</string>
<string id="SettingsApiUrl">URL pro HomeAssistant API.</string>
<string id="SettingsConfigUrl">URL pro konfiguraci nabídky (JSON).</string>
<string id="SettingsCacheConfig">Měla by aplikace ukládat konfiguraci nabídky?</string>
<string id="SettingsClearCache">Měla by aplikace vymazat stávající mezipaměť příště, až bude spuštěna?</string>
<string id="WifiLteExecutionEnable">Povolit prováděpříkazů přes Wi-Fi/LTE.</string>
<string id="SettingsClearCache">Měla by aplikace vymazat stávající mezipaměť při příštím spuštění?</string>
<string id="SettingsEnableMenuUpdateCheck">Kontrolovat aktualizace menu při spuštění aplikace? Poznámka: Ukládámenu do mezipaměti musí být povoleno. Toto nastavení může způsobit pád starších zařízení s menší pamětí.</string>
<string id="SettingsWifiLteExecutionEnable">Povolit provádění příkazů přes Wi-Fi/LTE.</string>
<string id="SettingsVibration">Měla by aplikace poskytovat zpětnou vazbu prostřednictvím vibrací?</string>
<string id="SettingsAppTimeout">Timeout během několika sekund. Po tomto období nečinnosti uložte aplikaci k uložení baterie zařízení.</string>
<string id="SettingsPollDelay">Další zpoždění hlasování (v sekundách). Přidá zpoždění mezi aktualizací stavu všech položek nabídky.</string>
<string id="SettingsConfirmTimeout">Po této době (v sekundách) je potvrzovací dialog pro akci automaticky uzavřen a akce je zrušena. Nastavit na 0 pro deaktivaci časového limitu.</string>
<string id="SettingsPin">4místný pin, který se má použít pro všechny akce, které to vyžadují (0000-9999).</string>
<string id="SettingsPinError">Nakonfigurujte prosím platný čtyřmístný číselný pin mezi 0000 a 9999 v nastavení aplikace.</string>
<string id="SettingsTextAlign">Vlevo (vypnuto) nebo vpravo (ON) zarovnání nabídky.</string>
<string id="LeftToRight">Zleva doprava</string>
<string id="RightToLeft">Vpravo doleva</string>
<string id="SettingsWidgetStart">(Pouze widget) automaticky spusťte aplikaci z widgetu bez čekání na klepnutí.</string>
<string id="SettingsEnableBatteryLevel">Umožněte službě pozadí odeslat úroveň baterie, umístění baterie zařízení a (pokud je podporována) údaje o aktivitě domácímu asistentovi.</string>
<string id="SettingsBatteryLevelRefreshRate">Obnovení frekvence (v minutách), při kterém by měla služba na pozadí opakovat odesílání dat.</string>
<string id="SettingsUserHttpHeader">Uživatel dodaný záhlaví HTTP</string>
<string id="SettingsUserHttpHeaderDescription">Některá instalace domácího asistenta vyžadují specifikaci vlastní hlaví HTTP, aby fungovaly.</string>
<string id="SettingsUserHttpHeaderName">Uživatel dodaný HTTP-HEADER: Jméno</string>
<string id="SettingsUserHttpHeaderValue">Uživatel dodaný HTTP-HEADER: Hodnota</string>
<string id="WebhookId">(Pouze číst) ID Webhook vytvořené zařízením pro aktualizace služby na pozadí. Možná to budete potřebovat pro ladění.</string>
<string id="SettingsAppTimeout">Časový limit v sekundách. Ukončete aplikaci po této době nečinnosti, abyste šetřili baterii zařízení.</string>
<string id="SettingsPollDelay">Další zpoždění dotazování (v sekundách). Přidá zpoždění mezi aktualizací stavu všech položek nabídky.</string>
<string id="SettingsConfirmTimeout">Po této době (v sekundách) je potvrzovací dialog pro akci automaticky uzavřen a akce je zrušena. Nastavte na 0 pro deaktivaci časového limitu.</string>
<string id="SettingsPin">4místný PIN, který se má použít pro všechny akce, které jej vyžadují (0000-9999).</string>
<string id="SettingsPinError">Nakonfigurujte prosím platný čtyřmístný číselný PIN mezi 0000 a 9999 v nastavení aplikace.</string>
<string id="SettingsTextAlign">Vlevo (vypnuto) nebo vpravo (zapnuto) zarovnání nabídky.</string>
<string id="SettingsLeftToRight">Zleva doprava</string>
<string id="SettingsRightToLeft">Vpravo doleva</string>
<string id="SettingsWidgetStart">(Pouze widget) Automatické spuštění aplikace z widgetu bez čekání na klepnutí.</string>
<string id="SettingsEnableBatteryLevel">Povolit službě na pozadí odesílat úroveň baterie zařízení, jeho polohu a (pokud je podporováno) údaje o aktivitě do Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Frekvence aktualizace (v minutách), s jakou má služba na pozadí opakova odesílat data.</string>
<string id="SettingsUserHttpHeader">Uživatelská hlavička HTTP</string>
<string id="SettingsUserHttpHeaderDescription">Některé instalace Home Assistant vyžadují specifikaci vlastní hlavičky HTTP pro správnou funkci.</string>
<string id="SettingsUserHttpHeaderName">Uživatelská hlavička HTTP: Název</string>
<string id="SettingsUserHttpHeaderValue">Uživatelská hlavička HTTP: Hodnota</string>
<string id="SettingsClearWebhookId">Znovu se připojte k Home Assistant (vymazat ID Webhooku, viz příručka pro odstraňování problémů).</string>
<string id="SettingsWebhookId">(Pouze pro čtení) ID Webhooku vytvořené zařízením pro aktualizace služby na pozadí. Možná to budete potřebovat pro ladění.</string>
</strings>

View File

@@ -14,70 +14,74 @@
-->
<!--
Generated by Google Translate: English to Danish
Genereret af Google Translate fra engelsk
Generated by Google Translate and gemini-2.5-flash from English to Danish
Genereret af Google Translate og gemini-2.5-flash fra engelsk til dansk
-->
<strings>
<string id="ApiFlood">API ringer for hurtig. Sænk venligst dine anmodninger.</string>
<string id="ApiUrlNotFound">URL ikke fundet. Potentiel API -URL -fejl i indstillinger.</string>
<string id="ApiFlood">API-kald er for hyppige. Sænk venligst dine anmodninger.</string>
<string id="ApiUrlNotFound">URL ikke fundet. Potentiel API-URL-fejl i indstillinger.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Tilgængelig</string>
<string id="Cached" scope="glance">Cache</string>
<string id="Checking" scope="glance">Kontrol ...</string>
<string id="ConfigUrlNotFound">URL ikke fundet. Potentiel konfigurations -URL -fejl i indstillinger.</string>
<string id="Cached" scope="glance">Cachelagret</string>
<string id="Checking" scope="glance">Kontrollerer...</string>
<string id="ConfigUrlNotFound">URL ikke fundet. Potentiel konfigurations-URL-fejl i indstillinger.</string>
<string id="Confirm">Sikker?</string>
<string id="Empty">Tom</string>
<string id="Executed" scope="glance">Bekræftet</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<string id="Memory" scope="glance">Hukommelse</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="NoConfigUrl" scope="glance">Ingen konfigurations -URL i applikationsindstillingerne.</string>
<string id="MenuUpdated">Menu opdateret, genstart.</string>
<string id="MenuCheckDisabled">Menuopdateringer deaktiveret.</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="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsindstillingerne.</string>
<string id="NoInternet">Ingen internetforbindelse.</string>
<string id="NoJson">Ingen JSON vendte tilbage fra HTTP -anmodning.</string>
<string id="NoJson">Ingen JSON modtaget fra HTTP-anmodning.</string>
<string id="NoPhone" scope="glance">Ingen telefonforbindelse.</string>
<string id="NoPhoneNoCache" scope="glance">Ingen telefonforbindelse, ingen cache -menu.</string>
<string id="NoResponse">Intet svar, tjek internetforbindelse</string>
<string id="TimedOut">Anmod om tidsbestemt ud</string>
<string id="PinInputLocked">Pin -indgang låst til</string>
<string id="NoPhoneNoCache" scope="glance">Ingen telefonforbindelse, ingen cachelagret menu.</string>
<string id="NoResponse">Intet svar, tjek internetforbindelsen.</string>
<string id="TimedOut">Anmodning udløb</string>
<string id="PinInputLocked">PIN-indtastning låst i</string>
<string id="PotentialError">Potentiel fejl</string>
<string id="Seconds">sekunder</string>
<string id="TemplateError">Skabelonfejl</string>
<string id="TrailingSlashErr">API -URL må ikke have en bageste skråstreg '/'.</string>
<string id="TrailingSlashErr">API-URL må ikke have en afsluttende skråstreg '/'.</string>
<string id="Unavailable" scope="glance">Utilgængelig</string>
<string id="Unconfigured" scope="glance">Ukonfigureret</string>
<string id="UnhandledHttpErr">HTTP -anmodning returneret fejlkode =</string>
<string id="UnhandledHttpErr">HTTP-anmodning returnerede fejlkode = </string>
<string id="WebhookFailed">Kunne ikke registrere webhook</string>
<string id="WrongPin">Forkert pin</string>
<string id="WrongPin">Forkert PIN</string>
<string id="WifiLteNotAvailable">Ingen Wi-Fi eller LTE tilgængelig</string>
<string id="WifiLtePrompt">Udfør over Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Sender til hjemmeassistent.</string>
<string id="WifiLtePrompt">Udfør via Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Sender til Home Assistant.</string>
<string id="WifiLteExecutionDataError">Ingen data modtaget.</string>
<!-- For indstillingerne GUI skal strenge være i den rækkefølge, de bruges. -->
<string id="SettingsSelect">Vælge...</string>
<string id="SettingsApiKey">API -nøgle til homeassistant.</string>
<string id="SettingsSelect">Vælg...</string>
<string id="SettingsApiKey">API-nøgle til Home Assistant.</string>
<string id="SettingsApiKeyPrompt">Langvarig adgangstoken.</string>
<string id="SettingsApiUrl">URL til homeassistant API.</string>
<string id="SettingsApiUrl">URL til Home Assistant API.</string>
<string id="SettingsConfigUrl">URL til menukonfiguration (JSON).</string>
<string id="SettingsCacheConfig">Skal applikationscache menuen Konfiguration?</string>
<string id="SettingsCacheConfig">Skal applikationen cachelagre menukonfigurationen?</string>
<string id="SettingsClearCache">Bør applikationen rydde den eksisterende cache næste gang den startes?</string>
<string id="WifiLteExecutionEnable">Aktivér udførelse af kommandoer over Wi-Fi/LTE.</string>
<string id="SettingsEnableMenuUpdateCheck">Kontroller for menuopdateringer på applikationsstart? Bemærk: Menu Cache skal være aktiveret. Denne indstilling kan forårsage, at ældre enheder med mindre hukommelse går ned.</string>
<string id="SettingsWifiLteExecutionEnable">Aktivér udførelse af kommandoer over Wi-Fi/LTE.</string>
<string id="SettingsVibration">Bør applikationen give feedback via vibrationer?</string>
<string id="SettingsAppTimeout">Timeout på få sekunder. Afslut applikationen efter denne periode med inaktivitet for at gemme enhedsbatteriet.</string>
<string id="SettingsPollDelay">Yderligere afstemningsforsinkelse (på få sekunder). Tilføjer en forsinkelse mellem statusopdateringen af alle menupunkter.</string>
<string id="SettingsConfirmTimeout">Efter denne tid (på få sekunder) lukkes en bekræftelsesdialog for en handling automatisk, og handlingen annulleres. Indstil til 0 for at deaktivere timeout.</string>
<string id="SettingsPin">4-cifret pin, der skal bruges til alle handlinger, der kræver det (0000-9999).</string>
<string id="SettingsPinError">Konfigurer venligst en gyldig 4-cifret numerisk pin mellem 0000 og 9999 i applikationsindstillingerne.</string>
<string id="SettingsTextAlign">Venstre (slukket) eller højre () menuindretning.</string>
<string id="LeftToRight">Venstre til højre</string>
<string id="RightToLeft">Ret til venstre</string>
<string id="SettingsAppTimeout">Timeout i sekunder. Afslut applikationen efter denne periode med inaktivitet for at spare på enhedens batteri.</string>
<string id="SettingsPollDelay">Yderligere afstemningsforsinkelse (i sekunder). Tilføjer en forsinkelse mellem statusopdateringen af alle menupunkter.</string>
<string id="SettingsConfirmTimeout">Efter denne tid (i sekunder) lukkes en bekræftelsesdialog for en handling automatisk, og handlingen annulleres. Indstil til 0 for at deaktivere timeout.</string>
<string id="SettingsPin">4-cifret PIN, der skal bruges til alle handlinger, der kræver det (0000-9999).</string>
<string id="SettingsPinError">Konfigurer venligst en gyldig 4-cifret numerisk PIN mellem 0000 og 9999 i applikationsindstillingerne.</string>
<string id="SettingsTextAlign">Venstre (fra) eller højre (til) menujustering.</string>
<string id="SettingsLeftToRight">Venstre til højre</string>
<string id="SettingsRightToLeft">Højre til venstre</string>
<string id="SettingsWidgetStart">(Kun widget) Start automatisk applikationen fra widgetten uden at vente på et tryk.</string>
<string id="SettingsEnableBatteryLevel">Aktivér baggrundstjenesten til at sende enhedsbatteriniveauet, placering og (hvis understøttes) aktivitetsdata til hjemmeassistent.</string>
<string id="SettingsBatteryLevelRefreshRate">Opdateringshastigheden (på få minutter), hvor baggrundstjenesten skal gentage afsendelsesdata.</string>
<string id="SettingsUserHttpHeader">Bruger leveret HTTP -header</string>
<string id="SettingsUserHttpHeaderDescription">Nogle hjemmeassistentinstallationer kræver specifikation af en brugerdefineret HTTP -header for at fungere.</string>
<string id="SettingsUserHttpHeaderName">Bruger leveret http-header: navn</string>
<string id="SettingsUserHttpHeaderValue">Bruger leveret http-header: værdi</string>
<string id="WebhookId">(Læs kun) Webhook -ID oprettet af enheden til opdateringer af baggrundstjeneste. Du kræver muligvis dette til fejlsøgning.</string>
<string id="SettingsEnableBatteryLevel">Aktivér baggrundstjenesten til at sende enhedens batteriniveau, lokation og (hvis understøttet) aktivitetsdata til Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Opdateringshastigheden (i minutter), hvormed baggrundstjenesten skal gentage afsendelse af data.</string>
<string id="SettingsUserHttpHeader">Brugerdefineret HTTP-header</string>
<string id="SettingsUserHttpHeaderDescription">Nogle Home Assistant-installationer kræver angivelse af en brugerdefineret HTTP-header for at fungere.</string>
<string id="SettingsUserHttpHeaderName">Brugerdefineret HTTP-header: Navn</string>
<string id="SettingsUserHttpHeaderValue">Brugerdefineret HTTP-header: Værdi</string>
<string id="SettingsClearWebhookId">Opret forbindelse igen til Home Assistant (ryd Webhook-ID, se fejlfindingsguide).</string>
<string id="SettingsWebhookId">(Kun læsning) Webhook-ID'et oprettet af enheden til opdateringer fra baggrundstjenesten. Du kan få brug for dette til fejlfinding.</string>
</strings>

View File

@@ -59,7 +59,7 @@
<string id="SettingsConfigUrl">URL für die Menükonfiguration (JSON).</string>
<string id="SettingsCacheConfig">Soll die App die Menükonfiguration cachen?</string>
<string id="SettingsClearCache">Soll die Anwendung beim nächsten Start den vorhandenen Cache löschen?</string>
<string id="WifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
<string id="SettingsWifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
<string id="SettingsVibration">Soll die App Rückmeldung per Vibration geben?</string>
<string id="SettingsAppTimeout">Timeout in Sekunden. Beendet die App nach dieser Inaktivitätszeit, um Akku zu sparen.</string>
<string id="SettingsPollDelay">Zusätzliche Abfrageverzögerung (in Sekunden). Fügt zwischen den Status-Updates der Menüeinträge eine Pause ein.</string>
@@ -68,7 +68,7 @@
<string id="SettingsPinError">Bitte eine gültige 4-stellige numerische PIN in den App Einstellungen eingeben (0000-9999).</string>
<string id="SettingsTextAlign">Menüausrichtung: Links (aus) oder Rechts (ein).</string>
<string id="RightToLeft">Von rechts nach links</string>
<string id="SettingsRightToLeft">Von rechts nach links</string>
<string id="SettingsWidgetStart">(Nur Widget) App automatisch aus dem Widget starten, ohne auf Tippen zu warten.</string>
<string id="SettingsEnableBatteryLevel">Hintergrunddienst aktivieren, um Akkustand, Standort und (falls unterstützt) Aktivitätsdaten an Home Assistant zu senden.</string>
<string id="SettingsBatteryLevelRefreshRate">Intervall (in Minuten), in dem der Hintergrunddienst die Daten erneut senden soll.</string>
@@ -76,5 +76,5 @@
<string id="SettingsUserHttpHeaderDescription">Einige Home Assistant-Installationen erfordern die Angabe eines benutzerdefinierten HTTP-Headers, um zu funktionieren.</string>
<string id="SettingsUserHttpHeaderName">Zusätzlicher HTTP-Header: Name</string>
<string id="SettingsUserHttpHeaderValue">Zusätzlicher HTTP-Header: Value</string>
<string id="WebhookId">(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>

View File

@@ -14,8 +14,8 @@
-->
<!--
Generated by Google Translate: English to German
Generiert von Google übersetzt aus Englisch
Generated by Google Translate and gemini-2.5-flash from English to German
Generiert von Google Translate und gemini-2.5-flash aus dem Englischen ins Deutsche
-->
<strings>
@@ -31,6 +31,8 @@
<string id="Executed" scope="glance">Bestätigt</string>
<string id="GlanceMenu" scope="glance">Menü</string>
<string id="Memory" scope="glance">Speicher</string>
<string id="MenuUpdated">Menü aktualisiert, neu starten.</string>
<string id="MenuCheckDisabled">Menü -Updates deaktiviert.</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="NoConfigUrl" scope="glance">Keine Menükonfigurations-URL (JSON) in den App-Einstellungen hinterlegt.</string>
@@ -54,7 +56,7 @@
<string id="WifiLtePrompt">Über WLAN/LTE ausführen?</string>
<string id="WifiLteExecutionTitle">Sende an Home Assistant.</string>
<string id="WifiLteExecutionDataError">Keine Daten empfangen.</string>
<!-- Für die Einstellungs -GUI sollten Zeichenfolgen in der Reihenfolge sein, in der sie verwendet werden. -->
<!-- Für die Einstellungs-Benutzeroberfläche sollten die Texte in der Reihenfolge ihrer Verwendung angeordnet sein. -->
<string id="SettingsSelect">Auswählen...</string>
<string id="SettingsApiKey">API-Schlüssel für HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Langzeit-Zugangstoken.</string>
@@ -62,7 +64,8 @@
<string id="SettingsConfigUrl">URL für die Menükonfiguration (JSON).</string>
<string id="SettingsCacheConfig">Soll die App die Menükonfiguration cachen?</string>
<string id="SettingsClearCache">Soll die Anwendung beim nächsten Start den vorhandenen Cache löschen?</string>
<string id="WifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
<string id="SettingsEnableMenuUpdateCheck">Überprüfen Sie die Menü -Updates für Anwendungsstart? HINWEIS: Das Menü Caching muss aktiviert sein. Diese Einstellung kann dazu führen, dass ältere Geräte mit weniger Speicher abstürzen.</string>
<string id="SettingsWifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
<string id="SettingsVibration">Soll die App Rückmeldung per Vibration geben?</string>
<string id="SettingsAppTimeout">Timeout in Sekunden. Beendet die App nach dieser Inaktivitätszeit, um Akku zu sparen.</string>
<string id="SettingsPollDelay">Zusätzliche Abfrageverzögerung (in Sekunden). Fügt zwischen den Status-Updates der Menüeinträge eine Pause ein.</string>
@@ -70,8 +73,8 @@
<string id="SettingsPin">4-stellige PIN für alle Aktionen, die diese erfordern (0000-9999).</string>
<string id="SettingsPinError">Bitte eine gültige 4-stellige numerische PIN in den App Einstellungen eingeben (0000-9999).</string>
<string id="SettingsTextAlign">Menüausrichtung: Links (aus) oder Rechts (ein).</string>
<string id="LeftToRight">Von links nach rechts</string>
<string id="RightToLeft">Von rechts nach links</string>
<string id="SettingsLeftToRight">Von links nach rechts</string>
<string id="SettingsRightToLeft">Von rechts nach links</string>
<string id="SettingsWidgetStart">(Nur Widget) App automatisch aus dem Widget starten, ohne auf Tippen zu warten.</string>
<string id="SettingsEnableBatteryLevel">Hintergrunddienst aktivieren, um Akkustand, Standort und (falls unterstützt) Aktivitätsdaten an Home Assistant zu senden.</string>
<string id="SettingsBatteryLevelRefreshRate">Intervall (in Minuten), in dem der Hintergrunddienst die Daten erneut senden soll.</string>
@@ -79,5 +82,6 @@
<string id="SettingsUserHttpHeaderDescription">Einige Home Assistant-Installationen erfordern die Angabe eines benutzerdefinierten HTTP-Headers, um zu funktionieren.</string>
<string id="SettingsUserHttpHeaderName">Zusätzlicher HTTP-Header: Name</string>
<string id="SettingsUserHttpHeaderValue">Zusätzlicher HTTP-Header: Value</string>
<string id="WebhookId">(Nur lesen) Die vom Gerät erstellte Webhook-ID für Hintergrund-Updates. Kann zum Debuggen benötigt werden.</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>
</strings>

View File

@@ -14,70 +14,89 @@
-->
<!--
Generated by Google Translate: English to Dutch
Gegenereerd door Google Translate uit het Engels
Generated by Google Translate and gemini-2.5-flash from English to Dutch
Gegenereerd door Google Translate en gemini-2.5-flash van Engels naar Nederlands
-->
<strings>
<string id="ApiFlood">API roept te snel. Vertraag uw verzoeken.</string>
<string id="ApiUrlNotFound">Url niet gevonden. Potentiële API -URL -fout in instellingen.</string>
<string id="ApiFlood">API-aanroepen te snel. Vertraag uw verzoeken.</string>
<string id="ApiUrlNotFound">URL niet gevonden. Potentiële API-URL-fout in instellingen.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Beschikbaar</string>
<string id="Cached" scope="glance">In de war</string>
<string id="Cached" scope="glance">In cache</string>
<string id="Checking" scope="glance">Controleren ...</string>
<string id="ConfigUrlNotFound">Url niet gevonden. Potentiële configuratie -URL -fout in instellingen.</string>
<string id="ConfigUrlNotFound">URL niet gevonden. Potentiële configuratie-URL-fout in
instellingen.</string>
<string id="Confirm">Zeker?</string>
<string id="Empty">Leeg</string>
<string id="Executed" scope="glance">Bevestigd</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<string id="Memory" scope="glance">Geheugen</string>
<string id="NoAPIKey" scope="glance">Geen API -toets 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="MenuUpdated">Menu bijgewerkt, opnieuw opstarten.</string>
<string id="MenuCheckDisabled">Menu-updates uitgeschakeld.</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="NoConfigUrl" scope="glance">Geen configuratie-URL in de toepassingsinstellingen.</string>
<string id="NoInternet">Geen internetverbinding.</string>
<string id="NoJson">Geen JSON keerde terug van het HTTP -verzoek.</string>
<string id="NoJson">Geen JSON ontvangen van het HTTP-verzoek.</string>
<string id="NoPhone" scope="glance">Geen telefoonverbinding.</string>
<string id="NoPhoneNoCache" scope="glance">Geen telefoonverbinding, geen menu in de cache.</string>
<string id="NoResponse">Geen antwoord, controleer internetverbinding</string>
<string id="TimedOut">Verzoek getimed uit</string>
<string id="PinInputLocked">Pin -ingang vergrendeld voor</string>
<string id="TimedOut">Verzoek is verlopen</string>
<string id="PinInputLocked">PIN-invoer vergrendeld voor</string>
<string id="PotentialError">Potentiële fout</string>
<string id="Seconds">seconden</string>
<string id="TemplateError">Sjabloonfout</string>
<string id="TrailingSlashErr">API -URL mag geen achterblijvende schuine streep '/' hebben.</string>
<string id="TrailingSlashErr">API-URL mag geen afsluitende schuine streep '/' hebben.</string>
<string id="Unavailable" scope="glance">Niet beschikbaar</string>
<string id="Unconfigured" scope="glance">Niet geconfigureerd</string>
<string id="UnhandledHttpErr">HTTP -verzoek geretourneerde foutcode =</string>
<string id="WebhookFailed">Kon WebHook niet registreren</string>
<string id="WrongPin">Verkeerde pin</string>
<string id="WifiLteNotAvailable">Geen wifi of LTE beschikbaar</string>
<string id="UnhandledHttpErr">HTTP-verzoek retourneerde foutcode =</string>
<string id="WebhookFailed">Kon Webhook niet registreren</string>
<string id="WrongPin">Verkeerde PIN</string>
<string id="WifiLteNotAvailable">Geen Wi-Fi of LTE beschikbaar</string>
<string id="WifiLtePrompt">Uitvoeren via Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Verzenden naar Home Assistant.</string>
<string id="WifiLteExecutionTitle">Verzenden naar homeassistent.</string>
<string id="WifiLteExecutionDataError">Geen gegevens ontvangen.</string>
<!-- Voor de instellingen GUI moeten strings in de volgorde zijn die ze worden gebruikt. -->
<!-- Voor de instellingen-GUI moeten strings in de volgorde staan waarin ze worden gebruikt. -->
<string id="SettingsSelect">Selecteer ...</string>
<string id="SettingsApiKey">API -sleutel voor homeassistent.</string>
<string id="SettingsApiKeyPrompt">Langleven Access Token.</string>
<string id="SettingsApiUrl">URL voor homeassistante API.</string>
<string id="SettingsApiKey">API-sleutel voor Home Assistant.</string>
<string id="SettingsApiKeyPrompt">Langdurige Access Token.</string>
<string id="SettingsApiUrl">URL voor Home Assistant API.</string>
<string id="SettingsConfigUrl">URL voor menuconfiguratie (JSON).</string>
<string id="SettingsCacheConfig">Moet de toepassingscache de menu -configuratie?</string>
<string id="SettingsClearCache">Moet de toepassing de bestaande cache wissen de volgende keer dat deze wordt gestart?</string>
<string id="WifiLteExecutionEnable">Schakel opdrachten uit via Wi-Fi/LTE.</string>
<string id="SettingsCacheConfig">Moet de applicatie de menuconfiguratie cachen?</string>
<string id="SettingsClearCache">Moet de applicatie de bestaande cache wissen bij de volgende
start?</string>
<string id="SettingsEnableMenuUpdateCheck">Controleren op menu-updates bij het starten van de applicatie? Let op: Menu-caching moet zijn ingeschakeld. Deze instelling kan ervoor zorgen dat oudere apparaten met minder geheugen crashen.</string>
<string id="SettingsWifiLteExecutionEnable">Schakel het uitvoeren van opdrachten via Wi-Fi/LTE in.</string>
<string id="SettingsVibration">Moet de applicatie feedback geven via trillingen?</string>
<string id="SettingsAppTimeout">Time -out in seconden. Verlaat de toepassing na deze periode van inactiviteit om de apparaatbatterij op te slaan.</string>
<string id="SettingsPollDelay">Aanvullende peilvertraging (in seconden). Voegt een vertraging toe tussen de statusupdate van alle menu -items.</string>
<string id="SettingsConfirmTimeout">Na deze tijd (in seconden) wordt een bevestigingsdialoogvenster voor een actie automatisch gesloten en wordt de actie geannuleerd. Ingesteld op 0 om de time -out uit te schakelen.</string>
<string id="SettingsPin">4-cijferige pin die moet worden gebruikt voor alle acties die dit vereisen (0000-9999).</string>
<string id="SettingsPinError">Configureer een geldige 4-cijferige numerieke pin tussen 0000 en 9999 in de toepassingsinstellingen.</string>
<string id="SettingsTextAlign">Links (uit) of rechts (AAN) menu -uitlijning.</string>
<string id="LeftToRight">Van links naar rechts</string>
<string id="RightToLeft">Van rechts naar links</string>
<string id="SettingsWidgetStart">(Alleen widget) Start de toepassing automatisch vanuit de widget zonder te wachten op een tik.</string>
<string id="SettingsEnableBatteryLevel">Schakel de achtergrondservice in om het batterijdniveau van het apparaat, de locatie en (indien ondersteunde) activiteitsgegevens naar Home Assistant te verzenden.</string>
<string id="SettingsBatteryLevelRefreshRate">De verversingssnelheid (in minuten) waarbij de achtergrondservice het verzenden van gegevens moet herhalen.</string>
<string id="SettingsUserHttpHeader">Gebruiker heeft de HTTP -header geleverd</string>
<string id="SettingsUserHttpHeaderDescription">Sommige installaties voor thuisassistent vereisen de specificatie van een aangepaste HTTP -header om te functioneren.</string>
<string id="SettingsUserHttpHeaderName">Gebruiker geleverd http-header: naam</string>
<string id="SettingsUserHttpHeaderValue">Gebruiker geleverd http-header: waarde</string>
<string id="WebhookId">(Alleen lezen) De webhook -ID die door het apparaat is gemaakt voor updates van de achtergrondservice. Misschien heeft u dit nodig voor foutopsporing.</string>
<string id="SettingsAppTimeout">Time-out in seconden. Sluit de applicatie af na deze periode van
inactiviteit om de batterij van het apparaat te sparen.</string>
<string id="SettingsPollDelay">Extra pollingvertraging (in seconden). Voegt een vertraging toe
tussen de statusupdate van alle menu-items.</string>
<string id="SettingsConfirmTimeout">Na deze tijd (in seconden) wordt een
bevestigingsdialoogvenster voor een actie automatisch gesloten en wordt de actie geannuleerd.
Stel in op 0 om de time-out uit te schakelen.</string>
<string id="SettingsPin">4-cijferige PIN die moet worden gebruikt voor alle acties die dit
vereisen (0000-9999).</string>
<string id="SettingsPinError">Configureer een geldige 4-cijferige numerieke PIN tussen 0000 en
9999 in de toepassingsinstellingen.</string>
<string id="SettingsTextAlign">Links (uit) of rechts (aan) menu-uitlijning.</string>
<string id="SettingsLeftToRight">Van links naar rechts</string>
<string id="SettingsRightToLeft">Van rechts naar links</string>
<string id="SettingsWidgetStart">(Alleen widget) Start de toepassing automatisch vanuit de widget
zonder te wachten op een tik.</string>
<string id="SettingsEnableBatteryLevel">Schakel de achtergrondservice in om het batterijniveau van
het apparaat, de locatie en (indien ondersteund) activiteitsgegevens naar Home Assistant te
verzenden.</string>
<string id="SettingsBatteryLevelRefreshRate">De verversingssnelheid (in minuten) waarbij de
achtergrondservice het verzenden van gegevens moet herhalen.</string>
<string id="SettingsUserHttpHeader">Door gebruiker opgegeven HTTP-header</string>
<string id="SettingsUserHttpHeaderDescription">Sommige Home Assistant-installaties vereisen de
specificatie van een aangepaste HTTP-header om te functioneren.</string>
<string id="SettingsUserHttpHeaderName">Door gebruiker opgegeven HTTP-header: Naam</string>
<string id="SettingsUserHttpHeaderValue">Door gebruiker opgegeven HTTP-header: Waarde</string>
<string id="SettingsClearWebhookId">Opnieuw verbinden met Home Assistant (Webhook-ID wissen, zie
Gids voor probleemoplossing).</string>
<string id="SettingsWebhookId">(Alleen lezen) De Webhook-ID die door het apparaat is gemaakt voor
updates van de achtergrondservice. Mogelijk heeft u dit nodig voor foutopsporing.</string>
</strings>

View File

@@ -14,70 +14,86 @@
-->
<!--
Generated by Google Translate: English to Estonian
Google'i loodud tõlke inglise keelest
Generated by Google Translate and gemini-2.5-flash from English to Estonian
Genereeritud Google Translate'i ja gemini-2.5-flashi poolt inglise keelest eesti keelde
-->
<strings>
<string id="ApiFlood">API nimetab liiga kiireks. Palun aeglustage oma taotlusi.</string>
<string id="ApiUrlNotFound">Url ei leitud. Võimalik API URL viga sätetes.</string>
<string id="ApiFlood">API kõned on liiga kiired. Palun aeglustage oma päringuid.</string>
<string id="ApiUrlNotFound">URL-i ei leitud. Võimalik API URL-i viga seadetes.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Saadav</string>
<string id="Cached" scope="glance">Vahemällu salvestatud</string>
<string id="Checking" scope="glance">Kontroll ...</string>
<string id="ConfigUrlNotFound">Url ei leitud. Võimalik konfiguratsiooni URL viga sätetes.</string>
<string id="Checking" scope="glance">Kontrollin...</string>
<string id="ConfigUrlNotFound">URL-i ei leitud. Võimalik konfiguratsiooni URL-i viga seadetes.</string>
<string id="Confirm">Kindel?</string>
<string id="Empty">Tühjendama</string>
<string id="Empty">Tühi</string>
<string id="Executed" scope="glance">Kinnitatud</string>
<string id="GlanceMenu" scope="glance">Menüü</string>
<string id="Memory" scope="glance">Mälu</string>
<string id="NoAPIKey" scope="glance">Rakenduse seadetes pole API -klahvi.</string>
<string id="NoApiUrl" scope="glance">Rakenduse seadetes pole API URL -i.</string>
<string id="NoConfigUrl" scope="glance">Rakenduse sätetes pole konfiguratsiooni URL -i.</string>
<string id="NoInternet">Interneti -ühendust pole.</string>
<string id="NoJson">Ükski JSON ei tulnud http päringult tagasi.</string>
<string id="MenuUpdated">Menüü värskendatud, taaskäivita.</string>
<string id="MenuCheckDisabled">Menüü värskendused keelatud.</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="NoConfigUrl" scope="glance">Rakenduse seadetes pole konfiguratsiooni URL-i.</string>
<string id="NoInternet">Interneti-ühendust pole.</string>
<string id="NoJson">HTTP päring ei tagastanud JSON-i.</string>
<string id="NoPhone" scope="glance">Telefoniühendust pole.</string>
<string id="NoPhoneNoCache" scope="glance">Pole telefoniühendust ega vahemällu salvestatud menüüd.</string>
<string id="NoResponse">Vastust pole, kontrollige Interneti -ühendust</string>
<string id="TimedOut">Taotlus on ajastatud</string>
<string id="PinInputLocked">PIN -i sisend lukustatud</string>
<string id="NoResponse">Vastust pole, kontrollige Interneti-ühendust</string>
<string id="TimedOut">Päring aegus</string>
<string id="PinInputLocked">PIN-koodi sisestus lukustatud</string>
<string id="PotentialError">Potentsiaalne viga</string>
<string id="Seconds">sekundid</string>
<string id="TemplateError">Malli viga</string>
<string id="TrailingSlashErr">API URL -l ei tohi olla kaldkriipsuga '/'.</string>
<string id="TrailingSlashErr">API URL-il ei tohi olla lõpus kaldkriipsu '/'.</string>
<string id="Unavailable" scope="glance">Kättesaamatu</string>
<string id="Unconfigured" scope="glance">Konfigureerimata</string>
<string id="UnhandledHttpErr">Http päringu tagastatud veakood =</string>
<string id="WebhookFailed">WebHooki registreerimine ei õnnestunud</string>
<string id="WrongPin">Vale tihvt</string>
<string id="UnhandledHttpErr">HTTP päring tagastas veakoodi = </string>
<string id="WebhookFailed">Webhooki registreerimine ebaõnnestus</string>
<string id="WrongPin">Vale PIN-kood</string>
<string id="WifiLteNotAvailable">Wi-Fi ega LTE pole saadaval</string>
<string id="WifiLtePrompt">Täita üle wi-fi/lte?</string>
<string id="WifiLteExecutionTitle">Koduassistendile saatmine.</string>
<string id="WifiLtePrompt">Täita üle Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Saadan Home Assistantile.</string>
<string id="WifiLteExecutionDataError">Andmeid pole laekunud.</string>
<!-- Seadete GUI jaoks peaksid keelpillid olema kasutatud järjekorras. -->
<string id="SettingsSelect">Valige ...</string>
<string id="SettingsApiKey">Homeassistant API võti.</string>
<!-- Seadete GUI jaoks peaksid stringid olema kasutamise järjekorras. -->
<string id="SettingsSelect">Valige...</string>
<string id="SettingsApiKey">API võti Home Assistantile.</string>
<string id="SettingsApiKeyPrompt">Pikaajaline juurdepääsuluba.</string>
<string id="SettingsApiUrl">URL homeassistantse API jaoks.</string>
<string id="SettingsApiUrl">URL Home Assistanti API jaoks.</string>
<string id="SettingsConfigUrl">URL menüü konfiguratsiooni jaoks (JSON).</string>
<string id="SettingsCacheConfig">Kas rakenduse vahemälu peaks menüü konfiguratsiooni vahemälu vahemälu vahemälu vahemälu vahemälu vahemälu vahemälu vahemälu</string>
<string id="SettingsClearCache">Kas rakendus peaks olemasoleva vahemälu järgmine kord alustama?</string>
<string id="WifiLteExecutionEnable">Luba käskude täitmine Wi-Fi/LTE kaudu.</string>
<string id="SettingsCacheConfig">Kas rakendus peaks menüü konfiguratsiooni vahemällu salvestama?</string>
<string id="SettingsClearCache">Kas rakendus peaks järgmisel käivitamisel olemasoleva vahemälu
tühjendama?</string>
<string id="SettingsEnableMenuUpdateCheck">Kontrolli menüü värskendusi rakenduse käivitamisel? Märkus: Menüü vahemällu salvestamine peab olema lubatud. See säte võib põhjustada vanemate, vähem mälu omavate seadmete kokkujooksmise.</string>
<string id="SettingsWifiLteExecutionEnable">Luba käskude täitmine Wi-Fi/LTE kaudu.</string>
<string id="SettingsVibration">Kas rakendus peaks vibratsiooni kaudu tagasisidet andma?</string>
<string id="SettingsAppTimeout">Aegumine sekunditega. Pärast seda tegevusetuse perioodi seade aku salvestamiseks väljuge rakendusest.</string>
<string id="SettingsPollDelay">Täiendav küsitluse viivitus (sekundites). Lisab viivituse kõigi menüüelementide olekuvärskenduse vahel.</string>
<string id="SettingsConfirmTimeout">Pärast seda aega (sekundites) suletakse toimingu kinnitusdialoog automaatselt ja toiming tühistatakse. Määrake aegumistähtaeg 0 -le.</string>
<string id="SettingsPin">4-kohaline tihvt, mida kasutatakse kõigi seda vajavate toimingute jaoks (0000-9999).</string>
<string id="SettingsPinError">Konfigureerige rakenduse seadetes kehtiv 4-kohaline numbriline nööpnõel vahemikus 0000 kuni 9999.</string>
<string id="SettingsTextAlign">Vasak (välja lülitatud) või parem (ON) menüü joondamine.</string>
<string id="LeftToRight">Vasakult paremale</string>
<string id="RightToLeft">Paremale vasakule</string>
<string id="SettingsWidgetStart">(Ainult vidin) käivitage rakendus vidinast automaatselt ilma kraani ootamata.</string>
<string id="SettingsEnableBatteryLevel">Luba taustteenus seadme aku taseme, asukoha ja (kui see on toetatud) tegevusandmete saatmine koduassistendile.</string>
<string id="SettingsBatteryLevelRefreshRate">Värskendusmäär (minutites), kus taustteenus peaks andmete saatmist korrata.</string>
<string id="SettingsUserHttpHeader">Kasutaja tarnitud HTTP päis</string>
<string id="SettingsUserHttpHeaderDescription">Mõned koduassistendi paigaldused vajavad funktsioneerimiseks kohandatud HTTP päise täpsustamist.</string>
<string id="SettingsUserHttpHeaderName">Kasutaja tarnitud HTTP-pea: nimi</string>
<string id="SettingsUserHttpHeaderValue">Kasutaja tarnitud HTTP-pea: väärtus</string>
<string id="WebhookId">(Loe ainult) WebHooki ID, mille seade on loonud taustteenuse värskenduste jaoks. Võite seda silumiseks nõuda.</string>
<string id="SettingsAppTimeout">Aegumine sekundites. Väljuge rakendusest pärast seda tegevusetuse
perioodi, et säästa seadme akut.</string>
<string id="SettingsPollDelay">Täiendav päringuviivitus (sekundites). Lisab viivituse kõigi
menüüelementide olekuvärskenduste vahele.</string>
<string id="SettingsConfirmTimeout">Pärast seda aega (sekundites) suletakse toimingu
kinnitusdialoog automaatselt ja toiming tühistatakse. Määra 0, et aegumine keelata.</string>
<string id="SettingsPin">4-kohaline PIN-kood, mida kasutatakse kõigi seda nõudvate toimingute
jaoks (0000-9999).</string>
<string id="SettingsPinError">Palun konfigureerige rakenduse seadetes kehtiv 4-kohaline numbriline
PIN-kood vahemikus 0000 kuni 9999.</string>
<string id="SettingsTextAlign">Vasak (väljas) või parem (sees) menüü joondus.</string>
<string id="SettingsLeftToRight">Vasakult paremale</string>
<string id="SettingsRightToLeft">Paremale vasakule</string>
<string id="SettingsWidgetStart">(Ainult vidin) Käivitage rakendus vidinast automaatselt, ilma
puudutust ootamata.</string>
<string id="SettingsEnableBatteryLevel">Luba taustateenusel saata seadme aku tase, asukoht ja (kui
toetatud) tegevusandmed Home Assistantile.</string>
<string id="SettingsBatteryLevelRefreshRate">Värskendussagedus (minutites), millega taustateenus
peaks andmete saatmist kordama.</string>
<string id="SettingsUserHttpHeader">Kasutaja määratud HTTP päis</string>
<string id="SettingsUserHttpHeaderDescription">Mõned Home Assistanti installatsioonid vajavad
toimimiseks kohandatud HTTP päise määramist.</string>
<string id="SettingsUserHttpHeaderName">Kasutaja määratud HTTP päis: Nimi</string>
<string id="SettingsUserHttpHeaderValue">Kasutaja määratud HTTP päis: Väärtus</string>
<string id="SettingsClearWebhookId">Ühenda uuesti Home Assistantiga (tühjenda Webhooki ID, vt
tõrkeotsingu juhendit).</string>
<string id="SettingsWebhookId">(Ainult lugemiseks) Seadme loodud Webhooki ID taustateenuse
värskenduste jaoks. Võite seda silumiseks vajada.</string>
</strings>

View File

@@ -14,70 +14,89 @@
-->
<!--
Generated by Google Translate: English to Finnish
Google -käännös englannista
Generated by Google Translate and gemini-2.5-flash from English to Finnish
Generoinut Google Translate ja gemini-2.5-flash englannista suomeksi
-->
<strings>
<string id="ApiFlood">API kutsuu liian nopeasti. Hidasta pyyntöjäsi.</string>
<string id="ApiUrlNotFound">URL -osoitetta ei löydy. Mahdollinen API -URL -URL -virhe asetuksissa.</string>
<string id="ApiFlood">API-kutsut liian tiheitä. Hidasta pyyntöjäsi.</string>
<string id="ApiUrlNotFound">URL-osoitetta ei löydy. Mahdollinen API-URL-virhe asetuksissa.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Käytettävissä oleva</string>
<string id="Cached" scope="glance">Välimuisti</string>
<string id="Checking" scope="glance">Tarkista ...</string>
<string id="ConfigUrlNotFound">URL -osoitetta ei löydy. Mahdollinen määritys URL -URL -virhe asetuksissa.</string>
<string id="Available" scope="glance">Käytettävissä</string>
<string id="Cached" scope="glance">Välimuistissa</string>
<string id="Checking" scope="glance">Tarkistetaan...</string>
<string id="ConfigUrlNotFound">URL-osoitetta ei löydy. Mahdollinen määritys-URL-virhe asetuksissa.</string>
<string id="Confirm">Varma?</string>
<string id="Empty">Tyhjä</string>
<string id="Executed" scope="glance">Vahvistettu</string>
<string id="GlanceMenu" scope="glance">Valikko</string>
<string id="Memory" scope="glance">Muisti</string>
<string id="NoAPIKey" scope="glance">Ei sovellusliittymää avainta sovellusasetuksissa.</string>
<string id="NoApiUrl" scope="glance">Ei sovellus -URL -osoitetta sovellusasetuksissa.</string>
<string id="NoConfigUrl" scope="glance">Ei määritys -URL -osoitetta sovellusasetuksissa.</string>
<string id="NoInternet">Ei Internet -yhteyttä.</string>
<string id="NoJson">Yksikään JSON ei palautettu HTTP -pyynnöstä.</string>
<string id="MenuUpdated">Valikko päivitetty, käynnistä uudelleen.</string>
<string id="MenuCheckDisabled">Valikkopäivitykset poistettu käytöstä.</string>
<string id="NoAPIKey" scope="glance">Ei API-avainta 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="NoInternet">Ei Internet-yhteyttä.</string>
<string id="NoJson">HTTP-pyynnöstä ei palautettu JSONia.</string>
<string id="NoPhone" scope="glance">Ei puhelinyhteyttä.</string>
<string id="NoPhoneNoCache" scope="glance">Ei puhelinyhteyttä, ei välimuistivalikkoa.</string>
<string id="NoResponse">Ei vastausta, tarkista Internet -yhteys</string>
<string id="TimedOut">Pyyntö ajoitettu</string>
<string id="PinInputLocked">PIN -syöttö lukittuna</string>
<string id="NoPhoneNoCache" scope="glance">Ei puhelinyhteyttä, ei välimuistissa olevaa valikkoa.</string>
<string id="NoResponse">Ei vastausta, tarkista Internet-yhteys</string>
<string id="TimedOut">Pyyntö aikakatkaistu</string>
<string id="PinInputLocked">PIN-syöttö lukittu ajaksi</string>
<string id="PotentialError">Mahdollinen virhe</string>
<string id="Seconds">sekunti</string>
<string id="Seconds">sekuntia</string>
<string id="TemplateError">Mallivirhe</string>
<string id="TrailingSlashErr">API -URL -osoite ei saa olla jäljellä oleva viiva '/'.</string>
<string id="TrailingSlashErr">API-URL-osoitteessa ei saa olla loppukauttaviivaa '/'.</string>
<string id="Unavailable" scope="glance">Ei käytettävissä</string>
<string id="Unconfigured" scope="glance">Määrittelemätön</string>
<string id="UnhandledHttpErr">HTTP -pyyntö palautti virhekoodin =</string>
<string id="UnhandledHttpErr">HTTP-pyyntö palautti virhekoodin =</string>
<string id="WebhookFailed">Webhookin rekisteröinti epäonnistui</string>
<string id="WrongPin">Vika</string>
<string id="WifiLteNotAvailable">Ei Wi-Fi: tä tai LTE: tä käytettävissä</string>
<string id="WifiLtePrompt">Suorita Wi-Fi/LTE: n kautta?</string>
<string id="WifiLteExecutionTitle">Lähetetään koti -avustajalle.</string>
<string id="WrongPin">Väärä PIN-koodi</string>
<string id="WifiLteNotAvailable">Ei Wi-Fiä tai LTE:tä käytettävissä.</string>
<string id="WifiLtePrompt">Suoritetaanko Wi-Fi/LTE-yhteyden kautta?</string>
<string id="WifiLteExecutionTitle">Lähetetään Home Assistantille.</string>
<string id="WifiLteExecutionDataError">Tietoja ei vastaanotettu.</string>
<!-- Asetusten käyttöliittymän osalta jousien tulisi olla siinä järjestyksessä, jossa niitä käytetään. -->
<string id="SettingsSelect">Valitse ...</string>
<string id="SettingsApiKey">API -avain homeSistentille.</string>
<string id="SettingsApiKeyPrompt">Pitkäikäinen pääsymerkki.</string>
<string id="SettingsApiUrl">URL -osoite Homeasistent -sovellusliittymälle.</string>
<string id="SettingsConfigUrl">Valikkokokoonpanon URL (JSON).</string>
<string id="SettingsCacheConfig">Pitäisikö sovelluksen välimuistiin valikon kokoonpano?</string>
<string id="SettingsClearCache">Pitäisikö sovelluksen tyhjentää olemassa oleva välimuisti seuraavalla kerralla?</string>
<string id="WifiLteExecutionEnable">Ota komentojen suorittaminen käyttöön Wi-Fi/LTE: n kautta.</string>
<!-- Asetusten käyttöliittymän osalta merkkijonojen tulisi olla siinä järjestyksessä, jossa niitä
käytetään. -->
<string id="SettingsSelect">Valitse...</string>
<string id="SettingsApiKey">API-avain HomeAssistantille.</string>
<string id="SettingsApiKeyPrompt">Pitkäikäinen käyttöoikeustunnus.</string>
<string id="SettingsApiUrl">URL-osoite HomeAssistantin API:lle.</string>
<string id="SettingsConfigUrl">Valikon määrityksen URL-osoite (JSON).</string>
<string id="SettingsCacheConfig">Pitäisikö sovelluksen tallentaa valikon kokoonpano välimuistiin?</string>
<string id="SettingsClearCache">Pitäisikö sovelluksen tyhjentää olemassa oleva välimuisti
seuraavalla käynnistyksellä?</string>
<string id="SettingsEnableMenuUpdateCheck">Tarkistetaanko valikkopäivitykset sovelluksen käynnistyksen yhteydessä? Huomaa: Valikon välimuistiin tallennus on oltava käytössä. Tämä asetus voi aiheuttaa vanhempien, vähemmän muistia omaavien laitteiden kaatumisen.</string>
<string id="SettingsWifiLteExecutionEnable">Ota komentojen suorittaminen käyttöön
Wi-Fi/LTE-yhteyden kautta.</string>
<string id="SettingsVibration">Pitäisikö sovelluksen antaa palautetta värähtelyjen kautta?</string>
<string id="SettingsAppTimeout">Aikakatkaisu sekunneissa. Poistu sovelluksesta tämän toimettomuuden jälkeen laitteen akun tallentamiseksi.</string>
<string id="SettingsPollDelay">Lisäkyselyviive (sekunneissa). Lisää viive kaikkien valikkokohteiden tilapäivityksen välillä.</string>
<string id="SettingsConfirmTimeout">Tämän ajan jälkeen (sekunneissa) toiminnan vahvistusvalintaikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoon 0 poistamaan aikakatkaisu käytöstä.</string>
<string id="SettingsPin">4-numeroinen PIN-koodi, jota käytetään kaikkiin sitä vaativiin toimiin (0000-9999).</string>
<string id="SettingsPinError">Määritä kelvollinen 4-numeroinen numeerinen PIN-arvo välillä 0000-9999 sovellusasetuksissa.</string>
<string id="SettingsAppTimeout">Aikakatkaisu sekunneissa. Poistu sovelluksesta tämän
toimettomuuden jälkeen säästääksesi laitteen akkua.</string>
<string id="SettingsPollDelay">Lisäkyselyviive (sekunneissa). Lisää viive kaikkien
valikkokohteiden tilapäivityksen välillä.</string>
<string id="SettingsConfirmTimeout">Tämän ajan jälkeen (sekunneissa) toiminnan
vahvistusvalintaikkuna suljetaan automaattisesti ja toiminto peruutetaan. Aseta arvoon 0
poistamaan aikakatkaisu käytöstä.</string>
<string id="SettingsPin">4-numeroinen PIN-koodi, jota käytetään kaikkiin sitä vaativiin toimiin
(0000-9999).</string>
<string id="SettingsPinError">Määritä kelvollinen 4-numeroinen numeerinen PIN-koodi välillä
0000-9999 sovellusasetuksissa.</string>
<string id="SettingsTextAlign">Vasen (pois päältä) tai oikea (on) valikon kohdistus.</string>
<string id="LeftToRight">Vasemmalta oikealle</string>
<string id="RightToLeft">Vasemmalle</string>
<string id="SettingsWidgetStart">(Vain widget) Käynnistä sovellus automaattisesti widgetistä odottamatta napautusta.</string>
<string id="SettingsEnableBatteryLevel">Ota taustapalvelu käyttöön laitteen akkutason, sijainnin ja (jos tuetun) aktiviteettitietojen lähettämiseksi kodin avustajalle.</string>
<string id="SettingsBatteryLevelRefreshRate">Päivitysnopeus (muutamassa minuutissa), jossa taustapalvelun tulisi toistaa tietojen lähettäminen.</string>
<string id="SettingsUserHttpHeader">Käyttäjä toimitti HTTP -otsikon</string>
<string id="SettingsUserHttpHeaderDescription">Jotkut kodin avustajaasennukset vaativat mukautetun HTTP -otsikon määrittelyn toiminnan varten.</string>
<string id="SettingsUserHttpHeaderName">Käyttäjä toimitti http-header: Nimi</string>
<string id="SettingsUserHttpHeaderValue">Käyttäjä toimitti HTTP-otsikon: arvo</string>
<string id="WebhookId">(Vain lue) laitteen luoma webhook -tunnus taustapalvelupäivityksiin. Saatat tarvita tätä virheenkorjausta varten.</string>
<string id="SettingsLeftToRight">Vasemmalta oikealle</string>
<string id="SettingsRightToLeft">Oikealta vasemmalle</string>
<string id="SettingsWidgetStart">(Vain widget) Käynnistä sovellus automaattisesti widgetistä
odottamatta napautusta.</string>
<string id="SettingsEnableBatteryLevel">Ota taustapalvelu käyttöön laitteen akkutason, sijainnin
ja (jos tuettu) aktiivisuustietojen lähettämiseksi Home Assistantille.</string>
<string id="SettingsBatteryLevelRefreshRate">Päivitysnopeus (minuuteissa), jolla taustapalvelun
tulisi toistaa tietojen lähettäminen.</string>
<string id="SettingsUserHttpHeader">Käyttäjän määrittämä HTTP-otsake</string>
<string id="SettingsUserHttpHeaderDescription">Jotkut Home Assistant -asennukset vaativat
mukautetun HTTP-otsakkeen määrittelyn toimiakseen.</string>
<string id="SettingsUserHttpHeaderName">Käyttäjän määrittämä HTTP-otsake: Nimi</string>
<string id="SettingsUserHttpHeaderValue">Käyttäjän määrittämä HTTP-otsake: Arvo</string>
<string id="SettingsClearWebhookId">Yhdistä uudelleen Home Assistantiin (tyhjennä Webhook ID,
katso vianetsintäopas).</string>
<string id="SettingsWebhookId">(Vain luku) Laitteen luoma Webhook ID taustapalvelun päivityksiä
varten. Saatat tarvita tätä virheenkorjaukseen.</string>
</strings>

View File

@@ -14,70 +14,93 @@
-->
<!--
Generated by Google Translate: English to French
Généré par Google Translate de l'anglais
Generated by Google Translate and gemini-2.5-flash from English to French
Généré par Google Translate et gemini-2.5-flash de l'anglais au français
-->
<strings>
<string id="ApiFlood">Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil.</string>
<string id="ApiUrlNotFound">URL introuvable. Erreur potentielle de l'URL de l'API dans les paramètres.</string>
<string id="ApiUrlNotFound">URL introuvable. L'URL de l'API est potentiellement erronée dans les
paramètres.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Disponible</string>
<string id="Cached" scope="glance">Mis en cache</string>
<string id="Checking" scope="glance">Vérification...</string>
<string id="ConfigUrlNotFound">URL introuvable. Erreur d'URL de configuration potentielle dans les paramètres.</string>
<string id="Confirm">Bien sûr?</string>
<string id="ConfigUrlNotFound">URL introuvable. L'URL de configuration est potentiellement erronée
dans les paramètres.</string>
<string id="Confirm">Confirmer ?</string>
<string id="Empty">Vide</string>
<string id="Executed" scope="glance">Confirmé</string>
<string id="Executed" scope="glance">Exécuté</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<string id="Memory" scope="glance">Mémoire</string>
<string id="MenuUpdated">Menu mis à jour, redémarrez.</string>
<string id="MenuCheckDisabled">Mises à jour du menu désactivées.</string>
<string id="NoAPIKey" scope="glance">Aucune clé 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 l'application.</string>
<string id="NoConfigUrl" scope="glance">Aucune URL de configuration dans les paramètres de
l'application.</string>
<string id="NoInternet">Pas de connexion Internet.</string>
<string id="NoJson">Aucun JSON n'est retourné de la demande HTTP.</string>
<string id="NoPhone" scope="glance">Aucune connexion par téléphone.</string>
<string id="NoPhoneNoCache" scope="glance">Pas de connexion par téléphone, pas de menu mis en cache.</string>
<string id="NoJson">Aucun JSON n'est retourné par la requête HTTP.</string>
<string id="NoPhone" scope="glance">Aucune connexion téléphonique.</string>
<string id="NoPhoneNoCache" scope="glance">Pas de connexion téléphonique, pas de menu en cache.</string>
<string id="NoResponse">Aucune réponse, vérifiez la connexion Internet</string>
<string id="TimedOut">Demande de chronométrage</string>
<string id="PinInputLocked">Entrée de broche verrouillée pour</string>
<string id="TimedOut">Délai d'attente dépassé</string>
<string id="PinInputLocked">Saisie du code PIN verrouillée pour</string>
<string id="PotentialError">Erreur potentielle</string>
<string id="Seconds">secondes</string>
<string id="TemplateError">Erreur de modèle</string>
<string id="TrailingSlashErr">L'URL de l'API ne doit pas avoir une barre oblique de fuite '/'.</string>
<string id="TrailingSlashErr">L'URL de l'API ne doit pas se terminer par une barre oblique '/'.</string>
<string id="Unavailable" scope="glance">Indisponible</string>
<string id="Unconfigured" scope="glance">Non configuré</string>
<string id="UnhandledHttpErr">La demande http renvoie le code d'erreur =</string>
<string id="WebhookFailed">Échec de l'enregistrement de WebHook</string>
<string id="WrongPin">Mauvaise épingle</string>
<string id="WifiLteNotAvailable">Pas de Wi-Fi ou LTE disponible</string>
<string id="WifiLtePrompt">Exécuter sur Wi-Fi / LTE?</string>
<string id="WifiLteExecutionTitle">Envoi à l'assistant à domicile.</string>
<string id="UnhandledHttpErr">La requête HTTP a renvo le code d'erreur =</string>
<string id="WebhookFailed">Échec de l'enregistrement du Webhook</string>
<string id="WrongPin">Code PIN incorrect</string>
<string id="WifiLteNotAvailable">Pas de Wi-Fi ou de LTE disponible</string>
<string id="WifiLtePrompt">Exécuter sur Wi-Fi / LTE ?</string>
<string id="WifiLteExecutionTitle">Envoi à Home Assistant.</string>
<string id="WifiLteExecutionDataError">Aucune donnée reçue.</string>
<!-- Pour l'interface graphique des paramètres, les cordes doivent être dans l'ordre où elles sont utilisées. -->
<!-- Pour l'interface graphique des paramètres, les chaînes doivent être dans l'ordre où elles
sont utilisées. -->
<string id="SettingsSelect">Sélectionner...</string>
<string id="SettingsApiKey">Clé API pour HomeSSistant.</string>
<string id="SettingsApiKeyPrompt">Jeton d'accès à longue durée de vie.</string>
<string id="SettingsApiUrl">URL pour API HomeSSistant.</string>
<string id="SettingsApiKey">Clé API pour HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Jeton d'accès de longue durée.</string>
<string id="SettingsApiUrl">URL pour l'API HomeAssistant.</string>
<string id="SettingsConfigUrl">URL pour la configuration du menu (JSON).</string>
<string id="SettingsCacheConfig">L'application devrait-elle mettre en cache la configuration du menu?</string>
<string id="SettingsClearCache">L'application devrait-elle effacer le cache existant la prochaine fois qu'il sera démarré?</string>
<string id="WifiLteExecutionEnable">Activer l'exécution des commandes sur Wi-Fi / LTE.</string>
<string id="SettingsVibration">L'application devrait-elle fournir des commentaires via des vibrations?</string>
<string id="SettingsAppTimeout">Timeout en quelques secondes. Quittez l'application après cette période d'inactivité pour enregistrer la batterie de l'appareil.</string>
<string id="SettingsPollDelay">Délai supplémentaire du scrutin (en secondes). Ajoute un délai entre la mise à jour d'état de tous les éléments de menu.</string>
<string id="SettingsConfirmTimeout">Après ce temps (en quelques secondes), une boîte de dialogue de confirmation pour une action est automatiquement fermée et l'action est annulée. Réglé sur 0 pour désactiver le délai d'attente.</string>
<string id="SettingsPin">PIN à 4 chiffres à utiliser pour toutes les actions qui l'exigent (0000-9999).</string>
<string id="SettingsPinError">Veuillez configurer une broche numérique à 4 chiffres valide entre 0000 et 9999 dans les paramètres de l'application.</string>
<string id="SettingsTextAlign">Alignement du menu gauche (off) ou droit (on).</string>
<string id="LeftToRight">De gauche à droite</string>
<string id="RightToLeft">De la droite à gauche</string>
<string id="SettingsWidgetStart">(Widget uniquement) Démarrez automatiquement l'application à partir du widget sans attendre un robinet.</string>
<string id="SettingsEnableBatteryLevel">Activez le service d'arrière-plan pour envoyer le niveau de la batterie de l'appareil, l'emplacement et (le cas échéant) les données d'activité à l'assistant à domicile.</string>
<string id="SettingsBatteryLevelRefreshRate">Le taux de rafraîchissement (en minutes) auquel le service d'arrière-plan doit répéter l'envoi de données.</string>
<string id="SettingsCacheConfig">L'application devrait-elle mettre en cache la configuration du
menu ?</string>
<string id="SettingsClearCache">L'application devrait-elle effacer le cache existant la prochaine
fois qu'elle sera démarrée ?</string>
<string id="SettingsEnableMenuUpdateCheck">Vérifier les mises à jour du menu au démarrage de l'application ? Remarque : la mise en cache du menu doit être activée. Ce paramètre peut entraîner le plantage des appareils plus anciens avec moins de mémoire.</string>
<string id="SettingsWifiLteExecutionEnable">Activer l'exécution des commandes sur Wi-Fi / LTE.</string>
<string id="SettingsVibration">L'application devrait-elle fournir un retour par vibrations ?</string>
<string id="SettingsAppTimeout">Délai d'expiration en secondes. L'application se fermera après
cette période d'inactivité pour économiser la batterie de l'appareil.</string>
<string id="SettingsPollDelay">Délai d'interrogation supplémentaire (en secondes). Ajoute un délai
entre la mise à jour de l'état de tous les éléments de menu.</string>
<string id="SettingsConfirmTimeout">Après ce délai (en secondes), une boîte de dialogue de
confirmation pour une action est automatiquement fermée et l'action est annulée. Définir à 0
pour désactiver le délai d'attente.</string>
<string id="SettingsPin">Code PIN à 4 chiffres à utiliser pour toutes les actions qui l'exigent
(0000-9999).</string>
<string id="SettingsPinError">Veuillez configurer un code PIN numérique à 4 chiffres valide entre
0000 et 9999 dans les paramètres de l'application.</string>
<string id="SettingsTextAlign">Alignement du menu : Gauche (désactivé) ou Droit (activé).</string>
<string id="SettingsLeftToRight">De gauche à droite</string>
<string id="SettingsRightToLeft">De droite à gauche</string>
<string id="SettingsWidgetStart">(Widget uniquement) Démarre automatiquement l'application depuis
le widget sans attendre une pression.</string>
<string id="SettingsEnableBatteryLevel">Activer le service d'arrière-plan pour envoyer le niveau
de la batterie de l'appareil, l'emplacement et (le cas échéant) les données d'activité à Home
Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Le taux de rafraîchissement (en minutes) auquel le
service d'arrière-plan doit répéter l'envoi de données.</string>
<string id="SettingsUserHttpHeader">En-tête HTTP fourni par l'utilisateur</string>
<string id="SettingsUserHttpHeaderDescription">Certaines installations d'assistant à domicile nécessitent la spécification d'un en-tête HTTP personnalisé pour fonctionner.</string>
<string id="SettingsUserHttpHeaderName">Utilisateur fourni HTTP-Header: Nom</string>
<string id="SettingsUserHttpHeaderValue">Utilisateur HTTP-Header: Valeur</string>
<string id="WebhookId">(Lire uniquement) L'ID Webhook créé par l'appareil pour les mises à jour du service d'arrière-plan. Vous pourriez en avoir besoin pour le débogage.</string>
<string id="SettingsUserHttpHeaderDescription">Certaines installations Home Assistant nécessitent
la spécification d'un en-tête HTTP personnalisé pour fonctionner.</string>
<string id="SettingsUserHttpHeaderName">En-tête HTTP fourni par l'utilisateur : Nom</string>
<string id="SettingsUserHttpHeaderValue">En-tête HTTP fourni par l'utilisateur : Valeur</string>
<string id="SettingsClearWebhookId">Se reconnecter à Home Assistant (effacer l'ID du Webhook, voir
le guide de dépannage).</string>
<string id="SettingsWebhookId">(Lecture seule) L'ID Webhook créé par l'appareil pour les mises à
jour du service d'arrière-plan. Vous pourriez en avoir besoin pour le débogage.</string>
</strings>

View File

@@ -14,70 +14,91 @@
-->
<!--
Generated by Google Translate: English to Greek
Δημιουργήθηκε από το Google Translate από τα Αγγλικά
Generated by Google Translate and gemini-2.5-flash from English to Greek
Δημιουργήθηκε από το Google Translate και το gemini-2.5-flash από Αγγλικά σε Ελληνικά
-->
<strings>
<string id="ApiFlood">Το API καλεί πολύ γρήγορα. Παρακαλούμε επιβραδύνετε τα αιτήματά σας.</string>
<string id="ApiFlood">Οι κλήσεις API είναι πολύ συχνές. Παρακαλούμε επιβραδύνετε τα αιτήματά σας.</string>
<string id="ApiUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα URL API στις ρυθμίσεις.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Διαθέσιμος</string>
<string id="Cached" scope="glance">Αποθηκευμένος</string>
<string id="Checking" scope="glance">Ελεγχος...</string>
<string id="ConfigUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα URL διαμόρφωσης στις ρυθμίσεις.</string>
<string id="Confirm">Σίγουρος;</string>
<string id="Empty">Αδειάζω</string>
<string id="Executed" scope="glance">Επιβεβαιωμένος</string>
<string id="Available" scope="glance">Διαθέσιμο</string>
<string id="Cached" scope="glance">Αποθηκευμένο</string>
<string id="Checking" scope="glance">Έλεγχος...</string>
<string id="ConfigUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα URL διαμόρφωσης στις
ρυθμίσεις.</string>
<string id="Confirm">Σίγουρα;</string>
<string id="Empty">Κενό</string>
<string id="Executed" scope="glance">Επιβεβαιωμένο</string>
<string id="GlanceMenu" scope="glance">Μενού</string>
<string id="Memory" scope="glance">Μνήμη</string>
<string id="MenuUpdated">Ενημερώθηκε το μενού, επανεκκίνηση.</string>
<string id="MenuCheckDisabled">Οι ενημερώσεις μενού απενεργοποιήθηκαν.</string>
<string id="NoAPIKey" scope="glance">Δεν υπάρχει κλειδί API στις ρυθμίσεις εφαρμογής.</string>
<string id="NoApiUrl" scope="glance">Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις εφαρμογής.</string>
<string id="NoConfigUrl" scope="glance">Χωρίς διευθύνσεις διαμόρφωσης στις ρυθμίσεις εφαρμογής.</string>
<string id="NoConfigUrl" scope="glance">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις
εφαρμογής.</string>
<string id="NoInternet">Χωρίς σύνδεση στο Διαδίκτυο.</string>
<string id="NoJson">Κανένα JSON επέστρεψε από το αίτημα HTTP.</string>
<string id="NoJson">Κανένα JSON δεν επεστράφη από το αίτημα HTTP.</string>
<string id="NoPhone" scope="glance">Χωρίς σύνδεση τηλεφώνου.</string>
<string id="NoPhoneNoCache" scope="glance">Δεν υπάρχει σύνδεση τηλεφώνου, χωρίς προσωρινό μενού.</string>
<string id="NoPhoneNoCache" scope="glance">Δεν υπάρχει σύνδεση τηλεφώνου, δεν υπάρχει αποθηκευμένο
μενού.</string>
<string id="NoResponse">Χωρίς απάντηση, ελέγξτε τη σύνδεση στο Διαδίκτυο</string>
<string id="TimedOut">Αίτημα χρονομέτρου</string>
<string id="TimedOut">Το αίτημα έληξε</string>
<string id="PinInputLocked">Είσοδος PIN κλειδωμένη για</string>
<string id="PotentialError">Πιθανό σφάλμα</string>
<string id="Seconds">δευτερόλεπτα</string>
<string id="TemplateError">Σφάλμα προτύπου</string>
<string id="TrailingSlashErr">Το URL API δεν πρέπει να έχει μια κλίση "/'.</string>
<string id="Unavailable" scope="glance">Δυσεύρετος</string>
<string id="Unconfigured" scope="glance">Αδιευκρίνιστος</string>
<string id="UnhandledHttpErr">Αίτηση HTTP Επιστρέφεται κωδικός σφάλματος =</string>
<string id="TrailingSlashErr">Η διεύθυνση URL του API δεν πρέπει να έχει τελική κάθετο '/'.</string>
<string id="Unavailable" scope="glance">Μη διαθέσιμο</string>
<string id="Unconfigured" scope="glance">Μη διαμορφωμένο</string>
<string id="UnhandledHttpErr">Η αίτηση HTTP επέστρεψε κωδικό σφάλματος =</string>
<string id="WebhookFailed">Αποτυχία εγγραφής webhook</string>
<string id="WrongPin">Λάθος καρφίτσα</string>
<string id="WrongPin">Λάθος PIN</string>
<string id="WifiLteNotAvailable">Χωρίς Wi-Fi ή LTE διαθέσιμο</string>
<string id="WifiLtePrompt">Εκτέλεση μέσω Wi-Fi/LTE;</string>
<string id="WifiLteExecutionTitle">Αποστολή στον βοηθό στο σπίτι.</string>
<string id="WifiLteExecutionTitle">Αποστολή στο Home Assistant.</string>
<string id="WifiLteExecutionDataError">Δεν λαμβάνονται δεδομένα.</string>
<!-- Για τις ρυθμίσεις GUI, οι χορδές πρέπει να είναι με τη σειρά που χρησιμοποιούνται. -->
<string id="SettingsSelect">Επιλέγω...</string>
<string id="SettingsApiKey">API κλειδί για το Homeassistant.</string>
<string id="SettingsApiKeyPrompt">Διακριτικό πρόσβαση σε μακροχρόνια διάρκεια.</string>
<string id="SettingsApiUrl">URL για το Homeassistant API.</string>
<!-- Για το GUI ρυθμίσεων, οι συμβολοσειρές πρέπει να είναι με τη σειρά που χρησιμοποιούνται. -->
<string id="SettingsSelect">Επιλογή...</string>
<string id="SettingsApiKey">Κλειδί API για το Home Assistant.</string>
<string id="SettingsApiKeyPrompt">Διακριτικό πρόσβασης μακράς διάρκειας.</string>
<string id="SettingsApiUrl">URL για το API του Home Assistant.</string>
<string id="SettingsConfigUrl">URL για διαμόρφωση μενού (JSON).</string>
<string id="SettingsCacheConfig">Πρέπει η προσωρινή μνήμη εφαρμογής τη διαμόρφωση μενού;</string>
<string id="SettingsClearCache">Πρέπει η εφαρμογή να διαγράψει την υπάρχουσα μνήμη cache την επόμενη φορά που θα ξεκινήσει;</string>
<string id="WifiLteExecutionEnable">Ενεργοποιήστε τις εντολές εκτέλεσης μέσω Wi-Fi/LTE.</string>
<string id="SettingsCacheConfig">Να αποθηκεύει προσωρινά η εφαρμογή τη διαμόρφωση του μενού;</string>
<string id="SettingsClearCache">Πρέπει η εφαρμογή να διαγράψει την υπάρχουσα μνήμη cache την
επόμενη φορά που θα ξεκινήσει;</string>
<string id="SettingsEnableMenuUpdateCheck">Έλεγχος για ενημερώσεις μενού κατά την εκκίνηση της εφαρμογής; Σημείωση: Η προσωρινή αποθήκευση μενού πρέπει να είναι ενεργοποιημένη. Αυτή η ρύθμιση μπορεί να προκαλέσει σφάλματα σε παλαιότερες συσκευές με λιγότερη μνήμη.</string>
<string id="SettingsWifiLteExecutionEnable">Ενεργοποιήστε την εκτέλεση εντολών μέσω Wi-Fi/LTE.</string>
<string id="SettingsVibration">Πρέπει η εφαρμογή να παρέχει ανατροφοδότηση μέσω δονήσεων;</string>
<string id="SettingsAppTimeout">Χρονικό όριο σε δευτερόλεπτα. Βγείτε από την εφαρμογή μετά από αυτήν την περίοδο αδράνειας για να αποθηκεύσετε τη μπαταρία της συσκευής.</string>
<string id="SettingsPollDelay">Πρόσθετη καθυστέρηση δημοσκόπησης (σε δευτερόλεπτα). Προσθέτει μια καθυστέρηση μεταξύ της ενημέρωσης κατάστασης όλων των στοιχείων μενού.</string>
<string id="SettingsConfirmTimeout">Μετά από αυτό το χρονικό διάστημα (σε δευτερόλεπτα), ένα παράθυρο διαλόγου επιβεβαίωσης για μια ενέργεια κλείνει αυτόματα και η ενέργεια ακυρώνεται. Ρυθμίστε στο 0 για να απενεργοποιήσετε το χρονικό όριο.</string>
<string id="SettingsPin">4-ψηφία PIN που πρέπει να χρησιμοποιηθεί για όλες τις ενέργειες που το απαιτούν (0000-9999).</string>
<string id="SettingsPinError">Διαμορφώστε έναν έγκυρο τετραψήφιο αριθμητικό πείρο μεταξύ 0000 και 9999 στις ρυθμίσεις εφαρμογής.</string>
<string id="SettingsTextAlign">Αριστερά (απενεργοποίηση) ή δεξιά (ON) Ευθυγράμμιση μενού.</string>
<string id="LeftToRight">Από αριστερά προς τα δεξιά</string>
<string id="RightToLeft">Δεξιά προς τα αριστερά</string>
<string id="SettingsWidgetStart">(Μόνο widget) Ξεκινήστε αυτόματα την εφαρμογή από το widget χωρίς να περιμένετε μια βρύση.</string>
<string id="SettingsEnableBatteryLevel">Ενεργοποιήστε την υπηρεσία φόντου για την αποστολή της στάθμης της μπαταρίας της συσκευής, της θέσης και της (αν υποστηριχθεί) δεδομένων δραστηριότητας στον βοηθό στο σπίτι.</string>
<string id="SettingsBatteryLevelRefreshRate">Ο ρυθμός ανανέωσης (σε λεπτά) κατά τον οποίο η υπηρεσία φόντου πρέπει να επαναλαμβάνει τα δεδομένα αποστολής.</string>
<string id="SettingsUserHttpHeader">Παρέχεται η κεφαλίδα HTTP που παρέχεται από τον χρήστη</string>
<string id="SettingsUserHttpHeaderDescription">Ορισμένες εγκαταστάσεις βοηθού στο σπίτι απαιτούν την προδιαγραφή μιας προσαρμοσμένης κεφαλίδας HTTP για να λειτουργήσουν.</string>
<string id="SettingsUserHttpHeaderName">Παρέχεται ο χρήστης HTTP-Header: Όνομα</string>
<string id="SettingsUserHttpHeaderValue">Παρέχεται ο χρήστης HTTP-Header: Αξία</string>
<string id="WebhookId">(Μόνο διαβάστε) Το αναγνωριστικό WebHook που δημιουργήθηκε από τη συσκευή για ενημερώσεις υπηρεσιών φόντου. Μπορεί να το χρειαστείτε για εντοπισμό σφαλμάτων.</string>
<string id="SettingsAppTimeout">Χρονικό όριο σε δευτερόλεπτα. Η εφαρμογή θα κλείσει μετά από αυτήν
την περίοδο αδράνειας για εξοικονόμηση μπαταρίας της συσκευής.</string>
<string id="SettingsPollDelay">Πρόσθετη καθυστέρηση ανανέωσης (σε δευτερόλεπτα). Προσθέτει μια
καθυστέρηση μεταξύ της ενημέρωσης κατάστασης όλων των στοιχείων μενού.</string>
<string id="SettingsConfirmTimeout">Μετά από αυτό το χρονικό διάστημα (σε δευτερόλεπτα), ένα
παράθυρο διαλόγου επιβεβαίωσης για μια ενέργεια κλείνει αυτόματα και η ενέργεια ακυρώνεται.
Ρυθμίστε στο 0 για να απενεργοποιήσετε το χρονικό όριο.</string>
<string id="SettingsPin">4-ψήφιο PIN που χρησιμοποιείται για όλες τις ενέργειες που το απαιτούν
(0000-9999).</string>
<string id="SettingsPinError">Παρακαλούμε διαμορφώστε ένα έγκυρο 4-ψήφιο αριθμητικό PIN μεταξύ
0000 και 9999 στις ρυθμίσεις της εφαρμογής.</string>
<string id="SettingsTextAlign">Ευθυγράμμιση μενού: Αριστερά (απενεργοποιημένο) ή Δεξιά (ενεργό).</string>
<string id="SettingsLeftToRight">Από αριστερά προς τα δεξιά</string>
<string id="SettingsRightToLeft">Δεξιά προς τα αριστερά</string>
<string id="SettingsWidgetStart">(Μόνο widget) Αυτόματη εκκίνηση της εφαρμογής από το widget χωρίς
να περιμένετε άγγιγμα.</string>
<string id="SettingsEnableBatteryLevel">Ενεργοποιήστε την υπηρεσία παρασκηνίου για την αποστολή
της στάθμης μπαταρίας της συσκευής, της τοποθεσίας και (αν υποστηρίζονται) δεδομένων
δραστηριότητας στο Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Ο ρυθμός ανανέωσης (σε λεπτά) με τον οποίο η υπηρεσία
παρασκηνίου θα πρέπει να επαναλαμβάνει την αποστολή δεδομένων.</string>
<string id="SettingsUserHttpHeader">Κεφαλίδα HTTP που παρέχεται από τον χρήστη</string>
<string id="SettingsUserHttpHeaderDescription">Ορισμένες εγκαταστάσεις Home Assistant απαιτούν την
προδιαγραφή μιας προσαρμοσμένης κεφαλίδας HTTP για να λειτουργήσουν.</string>
<string id="SettingsUserHttpHeaderName">Κεφαλίδα HTTP που παρέχεται από τον χρήστη: Όνομα</string>
<string id="SettingsUserHttpHeaderValue">Κεφαλίδα HTTP που παρέχεται από τον χρήστη: Τιμή</string>
<string id="SettingsClearWebhookId">Επανασύνδεση στο Home Assistant (εκκαθάριση Webhook ID, δείτε
τον οδηγό αντιμετώπισης προβλημάτων).</string>
<string id="SettingsWebhookId">(Μόνο για ανάγνωση) Το Webhook ID που δημιουργήθηκε από τη συσκευή
για ενημερώσεις υπηρεσιών παρασκηνίου. Μπορεί να το χρειαστείτε για εντοπισμό σφαλμάτων.</string>
</strings>

View File

@@ -14,70 +14,83 @@
-->
<!--
Generated by Google Translate: English to Hebrew
נוצר על ידי Google Translate מאנגלית
Generated by Google Translate and gemini-2.5-flash from English to Hebrew
נוצר על ידי Google Translate ו-gemini-2.5-flash מאנגלית לעברית
-->
<strings>
<string id="ApiFlood">API קוראת מהירה מדי. אנא האט את בקשותיך.</string>
<string id="ApiUrlNotFound">כתובת אתר לא נמצאה. שגיאת כתובת URL פוטנציאלית בהגדרות.</string>
<string id="ApiFlood">קריאות API מהירות מדי. אנא האט את בקשותיך.</string>
<string id="ApiUrlNotFound">כתובת URL לא נמצאה. שגיאת כתובת URL פוטנציאלית בהגדרות.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">זָמִין</string>
<string id="Cached" scope="glance">מטמון</string>
<string id="Checking" scope="glance">בודק ...</string>
<string id="ConfigUrlNotFound">כתובת אתר לא נמצאה. שגיאת כתובת אתר תצורה פוטנציאלית בהגדרות.</string>
<string id="Confirm">בַּטוּחַ?</string>
<string id="Empty">רֵיק</string>
<string id="Executed" scope="glance">מְאוּשָׁר</string>
<string id="GlanceMenu" scope="glance">תַפרִיט</string>
<string id="Memory" scope="glance">זֵכֶר</string>
<string id="Available" scope="glance">זמין</string>
<string id="Cached" scope="glance">במטמון</string>
<string id="Checking" scope="glance">בודק...</string>
<string id="ConfigUrlNotFound">כתובת URL לא נמצאה. שגיאת כתובת URL פוטנציאלית של התצורה בהגדרות.</string>
<string id="Confirm">בטוח?</string>
<string id="Empty">ריק</string>
<string id="Executed" scope="glance">בוצע</string>
<string id="GlanceMenu" scope="glance">תפריט</string>
<string id="Memory" scope="glance">זיכרון</string>
<string id="MenuUpdated">התפריט עודכן, הפעל מחדש.</string>
<string id="MenuCheckDisabled">עדכוני תפריט מושבתים.</string>
<string id="NoAPIKey" scope="glance">אין מפתח API בהגדרות היישום.</string>
<string id="NoApiUrl" scope="glance">אין כתובת URL בהגדרות היישום.</string>
<string id="NoConfigUrl" scope="glance">אין כתובת אתר תצורה בהגדרות היישום.</string>
<string id="NoApiUrl" scope="glance">אין כתובת URL של ה-API בהגדרות היישום.</string>
<string id="NoConfigUrl" scope="glance">אין כתובת URL לתצורה בהגדרות היישום.</string>
<string id="NoInternet">אין חיבור לאינטרנט.</string>
<string id="NoJson">אף JSON לא חזר מבקשת HTTP.</string>
<string id="NoPhone" scope="glance">אין חיבור טלפון.</string>
<string id="NoPhoneNoCache" scope="glance">אין חיבור טלפון, אין תפריט במטמון.</string>
<string id="NoResponse">אין תגובה, בדוק את חיבור האינטרנט</string>
<string id="TimedOut">בקש מתוזמן</string>
<string id="PinInputLocked">קלט סיכה נעול עבור</string>
<string id="NoJson">לא התקבל JSON מבקשת HTTP.</string>
<string id="NoPhone" scope="glance">אין חיבור לטלפון.</string>
<string id="NoPhoneNoCache" scope="glance">אין חיבור לטלפון, אין תפריט במטמון.</string>
<string id="NoResponse">אין תגובה, בדוק את חיבור האינטרנט.</string>
<string id="TimedOut">פסק זמן לבקשה</string>
<string id="PinInputLocked">קלט PIN נעול עבור</string>
<string id="PotentialError">שגיאה פוטנציאלית</string>
<string id="Seconds">שניות</string>
<string id="TemplateError">שגיאת תבנית</string>
<string id="TrailingSlashErr">כתובת API אסור שיהיה לו סלאש נגרר '/'.</string>
<string id="TrailingSlashErr">כתובת ה-URL של ה-API אסור שתכלול קו נטוי בסוף '/'.</string>
<string id="Unavailable" scope="glance">לא זמין</string>
<string id="Unconfigured" scope="glance">לא מוגדר</string>
<string id="UnhandledHttpErr">בקשת HTTP קוד שגיאה שהוחזר =</string>
<string id="WebhookFailed">נכשל ברישום WebHook</string>
<string id="WrongPin">סיכה שגויה</string>
<string id="UnhandledHttpErr">בקשת HTTP החזירה קוד שגיאה = </string>
<string id="WebhookFailed">נכשל רישום Webhook</string>
<string id="WrongPin">PIN שגוי</string>
<string id="WifiLteNotAvailable">אין Wi-Fi או LTE זמינים</string>
<string id="WifiLtePrompt">להורג באמצעות Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">שולח לעוזר הבית.</string>
<string id="WifiLtePrompt">לבצע דרך Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">שולח אל Home Assistant.</string>
<string id="WifiLteExecutionDataError">לא התקבלו נתונים.</string>
<!-- עבור ה- GUI של הגדרות, המיתרים צריכים להיות בסדר שהם משתמשים בהם. -->
<string id="SettingsSelect">לִבחוֹר...</string>
<string id="SettingsSelect">בחר...</string>
<string id="SettingsApiKey">מפתח API עבור HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">אסימון גישה ארוכת שנים.</string>
<string id="SettingsApiUrl">כתובת URL לממשק API עמדתי.</string>
<string id="SettingsConfigUrl">כתובת אתר לתצורת תפריט (JSON).</string>
<string id="SettingsCacheConfig">האם על היישום למנוע את תצורת התפריט?</string>
<string id="SettingsClearCache">האם על היישום לנקות את המטמון הקיים בפעם הבאה שהוא מתחיל?</string>
<string id="WifiLteExecutionEnable">אפשר לבצע פקודות דרך Wi-Fi/LTE.</string>
<string id="SettingsVibration">האם על היישום לספק משוב באמצעות תנודות?</string>
<string id="SettingsAppTimeout">פסק זמן בשניות. צא מהיישום לאחר תקופת חוסר פעילות זו כדי לחסוך את סוללת ההתקן.</string>
<string id="SettingsPollDelay">עיכוב נוסף בסקר (תוך שניות). מוסיף עיכוב בין עדכון הסטטוס של כל פריטי התפריט.</string>
<string id="SettingsConfirmTimeout">לאחר זמן זה (תוך שניות), דיאלוג אישור לפעולה נסגר אוטומטית והפעולה מבוטלת. מוגדר ל 0 כדי להשבית את פסק הזמן.</string>
<string id="SettingsPin">סיכה עם 4 ספרות שישמשו לכל הפעולות הדורשות אותה (0000-9999).</string>
<string id="SettingsPinError">אנא קבע את התצורה של סיכה מספרית תקפה בת 4 ספרות בין 0000 ל- 9999 בהגדרות היישום.</string>
<string id="SettingsTextAlign">יישור תפריט משמאל (כבוי) או ימין (ON).</string>
<string id="LeftToRight">משמאל לימין</string>
<string id="RightToLeft">ימין לשמאל</string>
<string id="SettingsWidgetStart">(ווידג'ט בלבד) הפעל אוטומטית את היישום מהווידג'ט מבלי לחכות לברז.</string>
<string id="SettingsEnableBatteryLevel">אפשר לשירות הרקע לשלוח את רמת סוללת המכשיר, מיקום ו (אם נתמך) נתוני פעילות לעוזר הבית.</string>
<string id="SettingsBatteryLevelRefreshRate">קצב הרענון (בדקות) בו שירות הרקע צריך לחזור על שליחת נתונים.</string>
<string id="SettingsUserHttpHeader">כותרת HTTP סיפקה למשתמש</string>
<string id="SettingsUserHttpHeaderDescription">כמה התקנות עוזרות ביתיות דורשות מפרט של כותרת HTTP מותאמת אישית כדי לתפקד.</string>
<string id="SettingsUserHttpHeaderName">המשתמש סיפק HTTP-HEADER: שם</string>
<string id="SettingsUserHttpHeaderValue">המשתמש סיפק HTTP-HEADER: ערך</string>
<string id="WebhookId">(קרא בלבד) מזהה WebHook שנוצר על ידי המכשיר לעדכוני שירות רקע. אתה עשוי לדרוש זאת לצורך ניפוי באגים.</string>
<string id="SettingsApiKeyPrompt">אסימון גישה ארוך טווח.</string>
<string id="SettingsApiUrl">כתובת URL עבור ה-API של HomeAssistant.</string>
<string id="SettingsConfigUrl">כתובת URL לתצורת תפריט (JSON).</string>
<string id="SettingsCacheConfig">האם היישום צריך לשמור את תצורת התפריט במטמון?</string>
<string id="SettingsClearCache">האם היישום צריך לנקות את המטמון הקיים בהפעלה הבאה?</string>
<string id="SettingsEnableMenuUpdateCheck">בדוק עדכוני תפריט בהפעלת היישום? הערה: שמירת תפריט במטמון חייבת להיות מופעלת. הגדרה זו עלולה לגרום למכשירים ישנים יותר עם פחות זיכרון לקרוס.</string>
<string id="SettingsWifiLteExecutionEnable">אפשר לבצע פקודות דרך Wi-Fi/LTE.</string>
<string id="SettingsVibration">האם היישום צריך לספק משוב באמצעות רעידות?</string>
<string id="SettingsAppTimeout">פסק זמן בשניות. היישום ייצא לאחר תקופת חוסר פעילות זו כדי לחסוך
בסוללת המכשיר.</string>
<string id="SettingsPollDelay">עיכוב סקר נוסף (בשניות). מוסיף עיכוב בין עדכוני הסטטוס של כל פריטי
התפריט.</string>
<string id="SettingsConfirmTimeout">לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית
והפעולה מבוטלת. הגדר ל-0 כדי להשבית את פסק הזמן.</string>
<string id="SettingsPin">PIN בן 4 ספרות שישמש לכל הפעולות הדורשות אותו (0000-9999).</string>
<string id="SettingsPinError">אנא הגדר PIN מספרי תקין בן 4 ספרות בין 0000 ל-9999 בהגדרות היישום.</string>
<string id="SettingsTextAlign">יישור תפריט: שמאל (כבוי) או ימין (מופעל).</string>
<string id="SettingsLeftToRight">משמאל לימין</string>
<string id="SettingsRightToLeft">מימין לשמאל</string>
<string id="SettingsWidgetStart">(ווידג'ט בלבד) הפעל אוטומטית את היישום מהווידג'ט מבלי לחכות
להקשה.</string>
<string id="SettingsEnableBatteryLevel">אפשר לשירות הרקע לשלוח את רמת סוללת המכשיר, מיקום ו(אם
נתמך) נתוני פעילות אל Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">קצב הרענון (בדקות) שבו שירות הרקע ישלח נתונים באופן
חוזר.</string>
<string id="SettingsUserHttpHeader">כותרת HTTP שסופקה על ידי המשתמש</string>
<string id="SettingsUserHttpHeaderDescription">חלק מהתקנות Home Assistant דורשות הגדרה של כותרת
HTTP מותאמת אישית כדי לתפקד.</string>
<string id="SettingsUserHttpHeaderName">כותרת HTTP שסופקה על ידי המשתמש: שם</string>
<string id="SettingsUserHttpHeaderValue">כותרת HTTP שסופקה על ידי המשתמש: ערך</string>
<string id="SettingsClearWebhookId">התחבר מחדש אל Home Assistant (נקה מזהה Webhook, ראה מדריך
לפתרון בעיות).</string>
<string id="SettingsWebhookId">(קריאה בלבד) מזהה Webhook שנוצר על ידי המכשיר לעדכוני שירות רקע.
ייתכן שתזדקק לכך לצורך ניפוי באגים.</string>
</strings>

View File

@@ -14,70 +14,88 @@
-->
<!--
Generated by Google Translate: English to Croatian
Generirao Google Translate s engleskog jezika
Generated by Google Translate and gemini-2.5-flash from English to Croatian
Generirano putem Google Prevoditelja i gemini-2.5-flash s engleskog na hrvatski
-->
<strings>
<string id="ApiFlood">API naziva prebrzo. Usporite svoje zahtjeve.</string>
<string id="ApiUrlNotFound">URL nije pronađen. Pogreška u URL -u API -ja u postavkama.</string>
<string id="ApiFlood">API pozivi prebrzi. Usporite svoje zahtjeve.</string>
<string id="ApiUrlNotFound">URL nije pronađen. Potencijalna pogreška API URL-a u postavkama.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Dostupan</string>
<string id="Cached" scope="glance">Predmemoran</string>
<string id="Checking" scope="glance">Provjera ...</string>
<string id="ConfigUrlNotFound">URL nije pronađen. Pogreška URL -a za konfiguraciju u postavkama.</string>
<string id="Confirm">Naravno?</string>
<string id="Cached" scope="glance">Predmemorirano</string>
<string id="Checking" scope="glance">Provjera...</string>
<string id="ConfigUrlNotFound">URL nije pronađen. Potencijalna pogreška URL-a konfiguracije u
postavkama.</string>
<string id="Confirm">Potvrdi?</string>
<string id="Empty">Prazan</string>
<string id="Executed" scope="glance">Potvrđen</string>
<string id="GlanceMenu" scope="glance">Jelovnik</string>
<string id="GlanceMenu" scope="glance">Izbornik</string>
<string id="Memory" scope="glance">Memorija</string>
<string id="MenuUpdated">Izbornik ažuriran, ponovno pokrenite.</string>
<string id="MenuCheckDisabled">Ažuriranja izbornika onemogućena.</string>
<string id="NoAPIKey" scope="glance">Nema API ključa u postavkama aplikacije.</string>
<string id="NoApiUrl" scope="glance">Nema URL -a API -ja u postavkama aplikacije.</string>
<string id="NoConfigUrl" scope="glance">Nema URL -a konfiguracije 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="NoInternet">Nema internetske veze.</string>
<string id="NoJson">Nijedan JSON nije se vratio s HTTP zahtjeva.</string>
<string id="NoJson">Nije primljen JSON odgovor na HTTP zahtjev.</string>
<string id="NoPhone" scope="glance">Nema telefonske veze.</string>
<string id="NoPhoneNoCache" scope="glance">Nema telefonske veze, nema predmemoriranog izbornika.</string>
<string id="NoResponse">Nema odgovora, provjerite internetsku vezu</string>
<string id="TimedOut">Zatražite tempirano</string>
<string id="PinInputLocked">Pin ulaz zaključan za</string>
<string id="TimedOut">Zahtjev je istekao</string>
<string id="PinInputLocked">Unos PIN-a zaključan na</string>
<string id="PotentialError">Potencijalna pogreška</string>
<string id="Seconds">sekundi</string>
<string id="TemplateError">Greška predloška</string>
<string id="TrailingSlashErr">URL API -ja ne smije imati zaostalu kosu '/'.</string>
<string id="TemplateError">Pogreška predloška</string>
<string id="TrailingSlashErr">API URL ne smije sadržavati kosu crtu '/' na kraju.</string>
<string id="Unavailable" scope="glance">Nedostupan</string>
<string id="Unconfigured" scope="glance">Nekonfiguriran</string>
<string id="UnhandledHttpErr">HTTP zahtjev vraćen kod pogreške =</string>
<string id="WebhookFailed">Nije uspjelo registrirati webhook</string>
<string id="WrongPin">Pogrešan pin</string>
<string id="WifiLteNotAvailable">Nije dostupno Wi-Fi ili LTE</string>
<string id="WifiLtePrompt">Izvršite preko Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Slanje kod kuće pomoćnika.</string>
<string id="UnhandledHttpErr">HTTP zahtjev vratio je kod pogreške = </string>
<string id="WebhookFailed">Registracija Webhooka nije uspjela</string>
<string id="WrongPin">Pogrešan PIN</string>
<string id="WifiLteNotAvailable">Wi-Fi ili LTE nije dostupno</string>
<string id="WifiLtePrompt">Izvršiti putem Wi-Fi/LTE?</string>
<string id="WifiLteExecutionTitle">Slanje u Home Assistant.</string>
<string id="WifiLteExecutionDataError">Nema primljenih podataka.</string>
<!-- Za postavke GUI, žice bi trebale biti u redoslijedu koji se koriste. -->
<string id="SettingsSelect">Odaberite ...</string>
<string id="SettingsApiKey">Ključ API -ja za HomeAssistant.</string>
<!-- Za GUI postavki, nizovi znakova trebaju biti poredani redoslijedom kojim se koriste. -->
<string id="SettingsSelect">Odaberite...</string>
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Dugotrajni pristupni token.</string>
<string id="SettingsApiUrl">URL za homeassistant API.</string>
<string id="SettingsApiUrl">URL za HomeAssistant API.</string>
<string id="SettingsConfigUrl">URL za konfiguraciju izbornika (JSON).</string>
<string id="SettingsCacheConfig">Treba li aplikacija predmemorirati konfiguraciju izbornika?</string>
<string id="SettingsClearCache">Treba li aplikacija očistiti postojeću predmemoriju sljedeći put kad se pokrene?</string>
<string id="WifiLteExecutionEnable">Omogući izvršavanje naredbi preko Wi-Fi/LTE.</string>
<string id="SettingsClearCache">Treba li aplikacija očistiti postojeću predmemoriju sljedeći put
kad se pokrene?</string>
<string id="SettingsEnableMenuUpdateCheck">Provjeriti ažuriranja izbornika pri pokretanju aplikacije? Napomena: Predmemoriranje izbornika mora biti omogućeno. Ova postavka može uzrokovati rušenje starijih uređaja s manje memorije.</string>
<string id="SettingsWifiLteExecutionEnable">Omogući izvršavanje naredbi putem Wi-Fi/LTE.</string>
<string id="SettingsVibration">Treba li aplikacija davati povratne informacije putem vibracija?</string>
<string id="SettingsAppTimeout">Timeout u sekundi. Izađite iz aplikacije nakon ovog razdoblja neaktivnosti kako biste uštedjeli bateriju uređaja.</string>
<string id="SettingsPollDelay">Dodatno kašnjenje ankete (u sekundi). Dodaje kašnjenje između ažuriranja statusa svih stavki izbornika.</string>
<string id="SettingsConfirmTimeout">Nakon tog vremena (u sekundi), dijaloški okvir za potvrdu za radnju automatski se zatvara i radnja se otkazuje. Postavite na 0 da onemogućite vremensko ograničenje.</string>
<string id="SettingsPin">Četveroznamenkasti pin koji će se koristiti za sve radnje koje zahtijevaju (0000-9999).</string>
<string id="SettingsPinError">Konfigurirajte valjani četveroznamenkasti numerički pin između 0000 i 9999 u postavkama aplikacije.</string>
<string id="SettingsTextAlign">Lijevo (isključeno) ili desno (ON) Poravnavanje izbornika.</string>
<string id="LeftToRight">Slijeva na desno</string>
<string id="RightToLeft">Desno lijevo</string>
<string id="SettingsWidgetStart">(Samo widget) Automatski pokrenite aplikaciju iz widgeta bez čekanja na dodir.</string>
<string id="SettingsEnableBatteryLevel">Omogućite pozadinsku uslugu da pošalje podatke o bateriji uređaja, lokaciji i (ako su podržani) podatke o aktivnostima kod kuće.</string>
<string id="SettingsBatteryLevelRefreshRate">Brzina osvježavanja (u minutama) u kojoj bi pozadinska usluga trebala ponoviti slanje podataka.</string>
<string id="SettingsUserHttpHeader">Korisnik isporučen HTTP zaglavlje</string>
<string id="SettingsUserHttpHeaderDescription">Neke instalacije kod kuće zahtijevaju specifikaciju prilagođenog HTTP zaglavlja kako bi funkcionirale.</string>
<string id="SettingsUserHttpHeaderName">Korisnik isporučen HTTP-Header: Ime</string>
<string id="SettingsUserHttpHeaderValue">Korisnik isporučen http-glava: Vrijednost</string>
<string id="WebhookId">(Samo pročitajte) ID Webhooka stvorio je uređaj za ažuriranja pozadine. Možda će vam to trebati za uklanjanje pogrešaka.</string>
<string id="SettingsAppTimeout">Istek vremena u sekundama. Izađite iz aplikacije nakon ovog
razdoblja neaktivnosti radi uštede baterije uređaja.</string>
<string id="SettingsPollDelay">Dodatno kašnjenje provjere (u sekundama). Dodaje kašnjenje između
ažuriranja statusa svih stavki izbornika.</string>
<string id="SettingsConfirmTimeout">Nakon tog vremena (u sekundama), dijaloški okvir za potvrdu
radnje automatski se zatvara i radnja se otkazuje. Postavite na 0 za onemogućavanje isteka
vremena.</string>
<string id="SettingsPin">Četveroznamenkasti PIN koji se koristi za sve radnje koje ga zahtijevaju
(0000-9999).</string>
<string id="SettingsPinError">Molimo konfigurirajte valjani četveroznamenkasti numerički PIN
između 0000 i 9999 u postavkama aplikacije.</string>
<string id="SettingsTextAlign">Poravnanje izbornika: lijevo (isključeno) ili desno (uključeno).</string>
<string id="SettingsLeftToRight">Slijeva na desno</string>
<string id="SettingsRightToLeft">Zdesna nalijevo</string>
<string id="SettingsWidgetStart">(Samo widget) Automatski pokrenite aplikaciju iz widgeta bez
čekanja na dodir.</string>
<string id="SettingsEnableBatteryLevel">Omogućite pozadinsku uslugu za slanje razine baterije
uređaja, lokacije i (ako je podržano) podataka o aktivnosti u Home Assistant.</string>
<string id="SettingsBatteryLevelRefreshRate">Brzina osvježavanja (u minutama) u kojoj bi
pozadinska usluga trebala ponoviti slanje podataka.</string>
<string id="SettingsUserHttpHeader">Korisnički HTTP zaglavlje</string>
<string id="SettingsUserHttpHeaderDescription">Neke instalacije Home Assistanta zahtijevaju
specifikaciju prilagođenog HTTP zaglavlja za funkcioniranje.</string>
<string id="SettingsUserHttpHeaderName">Korisnički HTTP zaglavlje: Naziv</string>
<string id="SettingsUserHttpHeaderValue">Korisnički HTTP zaglavlje: Vrijednost</string>
<string id="SettingsClearWebhookId">Ponovno se povežite s Home Assistantom (očisti ID Webhooka,
pogledajte vodič za rješavanje problema).</string>
<string id="SettingsWebhookId">(Samo za čitanje) ID Webhooka koji je uređaj stvorio za ažuriranja
pozadinske usluge. Možda će vam ovo trebati za otklanjanje pogrešaka.</string>
</strings>

View File

@@ -14,70 +14,90 @@
-->
<!--
Generated by Google Translate: English to Hungarian
A Google által generálta az angol nyelvről
Generated by Google Translate and gemini-2.5-flash from English to Hungarian
Fordította: Google Translate és gemini-2.5-flash angolról magyarra
-->
<strings>
<string id="ApiFlood">Az API túl gyorsan hív. Kérjük, lassítsa le kéréseit.</string>
<string id="ApiUrlNotFound">URL nem található. Potenciális API URL -hiba a beállításokban.</string>
<string id="ApiFlood">Az API hívások túl gyorsak. Kérjük, lassítsa a kéréseit.</string>
<string id="ApiUrlNotFound">URL nem található. Lehetséges API URL hiba a beállításokban.</string>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="Available" scope="glance">Elérhető</string>
<string id="Cached" scope="glance">Gyorsítótárazott</string>
<string id="Checking" scope="glance">Ellenőrzés ...</string>
<string id="ConfigUrlNotFound">URL nem található. Potenciális konfigurációs URL -hiba a beállításokban.</string>
<string id="Confirm">Persze?</string>
<string id="ConfigUrlNotFound">URL nem található. Lehetséges konfigurációs URL hiba a
beállításokban.</string>
<string id="Confirm">Biztos?</string>
<string id="Empty">Üres</string>
<string id="Executed" scope="glance">Megerősített</string>
<string id="GlanceMenu" scope="glance">Menü</string>
<string id="Memory" scope="glance">Emlékezet</string>
<string id="NoAPIKey" scope="glance">Nincs API -kulcs az alkalmazásbeállításokban.</string>
<string id="Memory" scope="glance">Memória</string>
<string id="MenuUpdated">Menü frissítve, indítsa újra.</string>
<string id="MenuCheckDisabled">Menüfrissítések letiltva.</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="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazásbeállításokban.</string>
<string id="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazás beállításaiban.</string>
<string id="NoInternet">Nincs internetkapcsolat.</string>
<string id="NoJson">A HTTP kérésből nem tért vissza JSON.</string>
<string id="NoJson">A HTTP kérés nem adott vissza JSON-t.</string>
<string id="NoPhone" scope="glance">Nincs telefonkapcsolat.</string>
<string id="NoPhoneNoCache" scope="glance">Nincs telefonkapcsolat, nincs gyorsítótárazott menü.</string>
<string id="NoResponse">Nincs válasz, ellenőrizze az internetkapcsolatot</string>
<string id="TimedOut">A kérés időzítve</string>
<string id="PinInputLocked">Pin -bemenetet zárva</string>
<string id="PotentialError">Potenciális hiba</string>
<string id="Seconds">másodpercek</string>
<string id="TimedOut">A kérés időtúllépés</string>
<string id="PinInputLocked">PIN bevitel zárolva</string>
<string id="PotentialError">Lehetséges hiba</string>
<string id="Seconds">másodperc</string>
<string id="TemplateError">Sablonhiba</string>
<string id="TrailingSlashErr">Az API URL -nek nem szabad végső perjelet kell tennie '/'.</string>
<string id="TrailingSlashErr">Az API URL nem tartalmazhat záró perjelet '/'.</string>
<string id="Unavailable" scope="glance">Nem érhető el</string>
<string id="Unconfigured" scope="glance">Nem konfigurálatlan</string>
<string id="UnhandledHttpErr">Http kérés visszaküldött hibakód =</string>
<string id="WebhookFailed">Nem sikerült regisztrálni a WebHook -ot</string>
<string id="WrongPin">Rossz csap</string>
<string id="Unconfigured" scope="glance">Konfigurálatlan</string>
<string id="UnhandledHttpErr">HTTP kérés hibakóddal tért vissza: </string>
<string id="WebhookFailed">Nem sikerült regisztrálni a webhookot</string>
<string id="WrongPin">Hibás PIN</string>
<string id="WifiLteNotAvailable">Nincs elérhető Wi-Fi vagy LTE</string>
<string id="WifiLtePrompt">Végrehajtás a Wi-Fi/LTE-n keresztül?</string>
<string id="WifiLteExecutionTitle">Küldés otthoni asszisztensnek.</string>
<string id="WifiLteExecutionDataError">Nincs adat.</string>
<string id="WifiLteExecutionTitle">Küldés a Home Assistantnek.</string>
<string id="WifiLteExecutionDataError">Nem érkezett adat.</string>
<!-- A beállítások GUI -jához a karakterláncoknak a használt sorrendben kell lenniük. -->
<string id="SettingsSelect">Válassza ki ...</string>
<string id="SettingsApiKey">API kulcs a homeaSsistant -hoz.</string>
<string id="SettingsApiKeyPrompt">Hosszú élettartamú hozzáférési jogkivonó.</string>
<string id="SettingsApiUrl">URL a Homeassistant API -hoz.</string>
<string id="SettingsSelect">Válasszon...</string>
<string id="SettingsApiKey">API kulcs a Home Assistanthez.</string>
<string id="SettingsApiKeyPrompt">Hosszú élettartamú hozzáférési token.</string>
<string id="SettingsApiUrl">URL a Home Assistant API-hoz.</string>
<string id="SettingsConfigUrl">URL a menükonfigurációhoz (JSON).</string>
<string id="SettingsCacheConfig">Az alkalmazásnak gyorsítótáraznia kell a menükonfigurációt?</string>
<string id="SettingsClearCache">Az alkalmazásnak törölnie kell -e a meglévő gyorsítótárat a következő indításkor?</string>
<string id="WifiLteExecutionEnable">Engedélyezze a parancsok végrehajtási végrehajtását a Wi-Fi/LTE-n keresztül.</string>
<string id="SettingsVibration">Az alkalmazásnak visszacsatolást kell adnia a rezgések révén?</string>
<string id="SettingsAppTimeout">Időtúllépés másodpercek alatt. Az eszköz akkumulátorának mentése érdekében kilépjen az alkalmazásból az inaktivitás után.</string>
<string id="SettingsPollDelay">További közvélemény -kutatási késleltetés (másodpercek alatt). Hozzáad egy késleltetést az összes menüelem állapotfrissítése között.</string>
<string id="SettingsConfirmTimeout">Ezen idő után (másodpercben) egy akció megerősítő párbeszédpanelje automatikusan bezáródik, és a műveletet töröljük. Állítsa 0 -ra az időtúllépés letiltásához.</string>
<string id="SettingsPin">4 számjegyű PIN-kódot, amelyet minden szükséges művelethez használni kell (0000-9999).</string>
<string id="SettingsPinError">Kérjük, konfiguráljon egy érvényes négyjegyű numerikus csapot 0000 és 9999 között az alkalmazás beállításaiban.</string>
<string id="SettingsTextAlign">Balra (ki) vagy jobb (be (be) menü igazítás.</string>
<string id="LeftToRight">Balról jobbra</string>
<string id="RightToLeft">Jobbról balra</string>
<string id="SettingsWidgetStart">(Csak widget) automatikusan indítsa el az alkalmazást a widgetről, anélkül, hogy megérintené a csapot.</string>
<string id="SettingsEnableBatteryLevel">Engedélyezze, hogy a háttérszolgáltatás az eszköz akkumulátorának szintjét, helyét és (ha támogatott) tevékenységi adatait elküldje az otthoni asszisztensnek.</string>
<string id="SettingsBatteryLevelRefreshRate">A háttérszolgáltatásnak a küldési adatokkal kell megismételnie a frissítési arányt (percekben).</string>
<string id="SettingsUserHttpHeader">A felhasználó szállított HTTP fejléc</string>
<string id="SettingsUserHttpHeaderDescription">Néhány otthoni asszisztens telepítéshez a működéshez egyéni HTTP fejléc meghatározására van szükség.</string>
<string id="SettingsUserHttpHeaderName">A felhasználó szállított HTTP-fejléc: Név</string>
<string id="SettingsUserHttpHeaderValue">A felhasználó szállított HTTP-fejléc: Érték</string>
<string id="WebhookId">(Csak olvassa el) Az eszköz által létrehozott webhook azonosító a háttérszolgáltatás frissítéseihez. Lehet, hogy ezt a hibakereséshez szükség lehet.</string>
<string id="SettingsCacheConfig">Gyorsítótárazza az alkalmazás a menükonfigurációt?</string>
<string id="SettingsClearCache">Törölje az alkalmazás a meglévő gyorsítótárat a következő
indításkor?</string>
<string id="SettingsEnableMenuUpdateCheck">Menüfrissítések ellenőrzése az alkalmazás indításakor? Megjegyzés: A menü gyorsítótárazásának engedélyezve kell lennie. Ez a beállítás régebbi, kevesebb memóriával rendelkező eszközök összeomlását okozhatja.</string>
<string id="SettingsWifiLteExecutionEnable">Parancsok végrehajtásának engedélyezése Wi-Fi/LTE-n
keresztül.</string>
<string id="SettingsVibration">Adjon visszajelzést az alkalmazás rezgésekkel?</string>
<string id="SettingsAppTimeout">Időtúllépés másodpercben. Az eszköz akkumulátorának kímélése
érdekében az alkalmazás kilép ennyi inaktivitás után.</string>
<string id="SettingsPollDelay">További lekérdezési késleltetés (másodpercben). Késleltetést ad az
összes menüelem állapotfrissítése közé.</string>
<string id="SettingsConfirmTimeout">Ezen idő (másodpercben) elteltével egy művelet megerősítő
párbeszédablaka automatikusan bezáródik, és a művelet megszakad. Állítsa 0-ra az időtúllépés
kikapcsolásához.</string>
<string id="SettingsPin">4 számjegyű PIN-kód, amelyet minden szükséges művelethez használni kell
(0000-9999).</string>
<string id="SettingsPinError">Kérjük, konfiguráljon egy érvényes 4 számjegyű numerikus PIN-kódot
0000 és 9999 között az alkalmazás beállításaiban.</string>
<string id="SettingsTextAlign">Menü igazítása: Balra (ki) vagy Jobbra (be).</string>
<string id="SettingsLeftToRight">Balról jobbra</string>
<string id="SettingsRightToLeft">Jobbról balra</string>
<string id="SettingsWidgetStart">(Csak widget) Az alkalmazás automatikus indítása a widgetről,
érintés nélkül.</string>
<string id="SettingsEnableBatteryLevel">Engedélyezze a háttérszolgáltatásnak, hogy elküldje az
eszköz akkumulátorának töltöttségi szintjét, helyét és (ha támogatott) tevékenységi adatait a
Home Assistantnek.</string>
<string id="SettingsBatteryLevelRefreshRate">Az adatküldés ismétlési gyakorisága (percekben),
amellyel a háttérszolgáltatásnak adatokat kell küldenie.</string>
<string id="SettingsUserHttpHeader">Felhasználó által megadott HTTP fejléc</string>
<string id="SettingsUserHttpHeaderDescription">Néhány Home Assistant telepítéshez egyéni HTTP
fejléc megadása szükséges a működéshez.</string>
<string id="SettingsUserHttpHeaderName">Felhasználó által megadott HTTP-fejléc: Név</string>
<string id="SettingsUserHttpHeaderValue">Felhasználó által megadott HTTP-fejléc: Érték</string>
<string id="SettingsClearWebhookId">Csatlakozás újra a Home Assistanthez (webhook azonosító
törlése, lásd a hibaelhárítási útmutatót).</string>
<string id="SettingsWebhookId">(Csak olvasható) Az eszköz által létrehozott webhook azonosító a
háttérszolgáltatás frissítéseihez. Szüksége lehet rá a hibakereséshez.</string>
</strings>

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="18" viewBox="0 0 48 48" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="white" stroke="white"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 546 B

View File

@@ -1,7 +1,15 @@
<svg height="18" viewBox="0 0 200 500" width="18" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 364 B

After

Width:  |  Height:  |  Size: 651 B

View File

@@ -1 +1,15 @@
<svg height="18" viewBox="0 -960 960 960" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="white" stroke="white"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 498 B

View File

@@ -0,0 +1,16 @@
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 673 B

View File

@@ -1 +1,13 @@
<svg height="18" viewBox="0 -960 960 960" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="white" stroke="white"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 783 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="18" viewBox="0 0 48 48" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="18" viewBox="0 0 200 500" width="18" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="18" viewBox="0 -960 960 960" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="18" viewBox="0 -960 960 960" width="18" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="18" viewBox="0 0 960 960" width="18" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="21" viewBox="0 0 48 48" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="white" stroke="white"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 716 B

After

Width:  |  Height:  |  Size: 546 B

View File

@@ -1,7 +1,15 @@
<svg height="21" viewBox="0 0 200 500" width="21" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="white" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 364 B

After

Width:  |  Height:  |  Size: 651 B

View File

@@ -1 +1,15 @@
<svg height="21" viewBox="0 -960 960 960" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="white" stroke="white"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 498 B

View File

@@ -0,0 +1,16 @@
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 673 B

View File

@@ -1 +1,13 @@
<svg height="21" viewBox="0 -960 960 960" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="white" stroke="white"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #dddddd; }
.colour2 { color: #ffffff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 783 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="21" viewBox="0 0 48 48" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="21" viewBox="0 0 200 500" width="21" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="21" viewBox="0 -960 960 960" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="21" viewBox="0 -960 960 960" width="21" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="21" viewBox="0 0 960 960" width="21" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="24" viewBox="0 0 48 48" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="24" viewBox="0 0 960 960" width="24" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="24" viewBox="0 0 200 500" width="24" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="24" viewBox="0 0 960 960" width="24" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="24" viewBox="0 -960 960 960" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="24" viewBox="0 0 960 960" width="24" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="24" viewBox="0 0 960 960" width="24" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="24" viewBox="0 -960 960 960" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="24" viewBox="0 0 960 960" width="24" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="26" viewBox="0 0 48 48" width="26" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="26" viewBox="0 0 960 960" width="26" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="26" viewBox="0 0 200 500" width="26" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="26" viewBox="0 0 960 960" width="26" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="26" viewBox="0 -960 960 960" width="26" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="26" viewBox="0 0 960 960" width="26" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="26" viewBox="0 0 960 960" width="26" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="26" viewBox="0 -960 960 960" width="26" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="26" viewBox="0 0 960 960" width="26" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="28" viewBox="0 0 48 48" width="28" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="28" viewBox="0 0 960 960" width="28" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="28" viewBox="0 0 200 500" width="28" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="28" viewBox="0 0 960 960" width="28" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="28" viewBox="0 -960 960 960" width="28" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="28" viewBox="0 0 960 960" width="28" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="28" viewBox="0 0 960 960" width="28" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="28" viewBox="0 -960 960 960" width="28" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="28" viewBox="0 0 960 960" width="28" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="30" viewBox="0 0 48 48" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="30" viewBox="0 0 960 960" width="30" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="30" viewBox="0 0 200 500" width="30" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="30" viewBox="0 0 960 960" width="30" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="30" viewBox="0 -960 960 960" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="30" viewBox="0 0 960 960" width="30" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="30" viewBox="0 0 960 960" width="30" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="30" viewBox="0 -960 960 960" width="30" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="30" viewBox="0 0 960 960" width="30" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="32" viewBox="0 0 48 48" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="32" viewBox="0 0 960 960" width="32" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

View File

@@ -1,7 +1,15 @@
<svg height="32" viewBox="0 0 200 500" width="32" xmlns="http://www.w3.org/2000/svg">
<g transform="matrix(1, 0, 0, 1, 0, 0)">
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="0"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="200"/>
<rect fill="blue" height="100" rx="40" ry="40" width="200" x="0" y="400"/>
</g>
<svg height="32" viewBox="0 0 960 960" width="32" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="160"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="400"/>
<rect class="colour1" height="160" rx="20" ry="20" width="560" x="300" y="640"/>
<circle class="colour2" cx="120" cy="240" r="80"/>
<circle class="colour2" cx="120" cy="480" r="80"/>
<circle class="colour2" cx="120" cy="720" r="80"/>
</svg>

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 653 B

View File

@@ -1 +1,15 @@
<svg height="32" viewBox="0 -960 960 960" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z" fill="blue" stroke="blue"/></svg>
<svg height="32" viewBox="0 0 960 960" width="32" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<circle cx="480" cy="280" r="60"/>
<rect height="360" rx="40" ry="40" width="120" x="420" y="410"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,16 @@
<svg height="32" viewBox="0 0 960 960" width="32" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
text.small { font: bold 400px sans-serif; }
text.large { font: bold 500px sans-serif; }
.colour1, .colour2 { fill: currentColor; }
rect.colour2 { stroke: currentColor; }
</style>
<rect class="colour2" fill-opacity="0.0" height="700" rx="100" ry="100" stroke-width="60" width="900" x="30" y="130"/>
<text class="small colour1" x="110" y="610">1</text>
<text class="large colour2" x="350" y="640">2</text>
<text class="small colour1" x="650" y="610">3</text>
</svg>

After

Width:  |  Height:  |  Size: 675 B

View File

@@ -1 +1,13 @@
<svg height="32" viewBox="0 -960 960 960" width="32" xmlns="http://www.w3.org/2000/svg"><path d="M445-80q-29 0-56-12t-45-35L127-403l21-23q14-15 34.5-18.5T221-438l99 53v-365q0-12.75 8.675-21.375 8.676-8.625 21.5-8.625 12.825 0 21.325 8.625T380-750v465l-144-77 156 198q10 12 23.76 18 13.76 6 29.24 6h205q38 0 64-26t26-64v-170q0-25.5-17.25-42.75T680-460H460v-60h219.646q50.148 0 85.251 35T800-400v170q0 63-43.5 106.5T650-80H445ZM203-665q-11.074-18.754-17.037-40.492Q180-727.229 180-750.246 180-821 229.725-870.5T350-920q70.55 0 120.275 49.738Q520-820.524 520-749.956q0 22.956-5.963 44.614Q508.074-683.685 497-665l-52-30q7-12 11-26t4-29.478Q460-796 427.882-828q-32.117-32-78-32Q304-860 272-827.917 240-795.833 240-750q0 15 4 29t11 26l-52 30Zm285 335Z" fill="blue" stroke="blue"/></svg>
<svg height="32" viewBox="0 0 960 960" width="32" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #0091ff; }
.colour2 { color: #00ccff; }
</style>
<style>
.colour1, .colour2 { fill: currentColor; }
</style>
<g>
<path class="colour1" d="m463.2,216.48c58.5,0 94.47,43.11 97.5,103.57l0,8l0,93.79l96.2,18.22c3.9,0.44 7.37,1.33 11.26,2.22c72.37,20 116.57,94.67 101.39,168.91l-1.73,8l-45.5,174.69c-9.53,36 -37.7,63.56 -73.23,71.56l-6.94,1.33l-104.86,15.56c-40.3,5.78 -79.3,-14.22 -98.8,-49.79l-3.47,-7.11l-1.3,-2.66c-10.4,-22.67 -25.57,-42.22 -44.64,-56.9l-8.24,-6.22l-81.47,-56.01l-4.34,-2.66l0,0l-4.34,-2.22l-102.26,-52.01c-10.83,-5.78 -17.77,-16.89 -17.77,-29.34c-1.3,-49.33 19.93,-87.12 61.1,-108.46c30.76,-15.56 71.06,-14.67 122.63,0.89l11.26,3.56l0,-185.35c0,-64.45 36.4,-111.57 97.5,-111.57l0.02,-0.01zm0,66.67c-19.93,0 -30.76,12 -32.5,38.67l0,6.22l0,232.91c0,24 -23.4,40.01 -45.07,31.11c-63.27,-27.12 -105.73,-33.34 -124.36,-23.56c-11.26,5.78 -18.2,12.89 -22.1,23.11l-1.73,5.33l82.33,42.22l7.8,4.45l0,0l7.8,4.45l81.47,56.01c29.46,20 53.73,47.56 70.63,79.57l5.2,11.11l1.3,2.66c5.2,12 16.9,19.11 29.46,19.11l4.34,0l104.86,-15.56c11.26,-1.77 20.8,-9.34 25.14,-20l1.73,-4.45l45.5,-174.24c10.83,-41.78 -13.43,-84.45 -53.73,-95.56l-3.03,-0.44l0,0l-125.66,-23.56c-14.3,-2.66 -24.7,-14.22 -26.44,-28l-0.43,-4.89l0,-121.79c0,-30.67 -10.83,-44.9 -32.5,-44.9l0,0.02z"/>
<path class="colour2" d="m463.81,60.98c137.36,0 249.16,114.24 249.16,255.58c0,31.11 -5.64,61.34 -15.6,88.9l-6.07,-2.22c-6.5,-2.22 -15.16,-5.33 -26.44,-8c-10.4,-2.22 -20.8,-4 -31.63,-4.89c9.53,-22.67 14.73,-47.56 14.73,-73.79c0,-104.46 -82.33,-188.9 -184.17,-188.9c-101.83,0 -184.17,84.45 -184.17,188.9c0,46.23 16.03,88.9 43.34,121.79c-13.86,1.33 -26,3.12 -35.53,5.33c-15.6,4 -25.57,7.55 -32.93,12c-25.14,-40.01 -39.87,-88.01 -39.87,-139.13c0,-141.35 111.37,-255.58 249.16,-255.58l0.01,0.01z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 781 B

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -20,4 +20,5 @@
<bitmap id="GroupTypeIcon" filename="group_type.svg"/>
<bitmap id="TapTypeIcon" filename="tap_type.svg"/>
<bitmap id="InfoTypeIcon" filename="info_type.svg"/>
<bitmap id="NumericTypeIcon" filename="numeric_type.svg"/>
</drawables>

View File

@@ -1 +1,16 @@
<svg height="34" viewBox="0 0 48 48" width="34" xmlns="http://www.w3.org/2000/svg"><path d="M24 34q.7 0 1.175-.475.475-.475.475-1.175 0-.7-.475-1.175Q24.7 30.7 24 30.7q-.7 0-1.175.475-.475.475-.475 1.175 0 .7.475 1.175Q23.3 34 24 34Zm-1.35-7.65h3V13.7h-3ZM24 44q-4.1 0-7.75-1.575-3.65-1.575-6.375-4.3-2.725-2.725-4.3-6.375Q4 28.1 4 23.95q0-4.1 1.575-7.75 1.575-3.65 4.3-6.35 2.725-2.7 6.375-4.275Q19.9 4 24.05 4q4.1 0 7.75 1.575 3.65 1.575 6.35 4.275 2.7 2.7 4.275 6.35Q44 19.85 44 24q0 4.1-1.575 7.75-1.575 3.65-4.275 6.375t-6.35 4.3Q28.15 44 24 44Zm.05-3q7.05 0 12-4.975T41 23.95q0-7.05-4.95-12T24 7q-7.05 0-12.025 4.95Q7 16.9 7 24q0 7.05 4.975 12.025Q16.95 41 24.05 41ZM24 24Z" fill="red" stroke="red"/></svg>
<svg height="34" viewBox="0 0 960 960" width="34" xmlns="http://www.w3.org/2000/svg">
<style id="colours">
.colour1 { color: #aa0000; }
.colour2 { color: #ff1111; }
</style>
<style>
.colour1 { stroke: currentColor; }
.colour2 { fill: currentColor; }
text.large { font: bold 600px sans-serif; }
</style>
<circle class="colour1" cx="480" cy="480" fill-opacity="0.0" r="400" stroke-width="60"/>
<g class="colour2">
<rect height="360" rx="40" ry="40" width="120" x="420" y="220"/>
<circle cx="480" cy="710" r="60"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 712 B

After

Width:  |  Height:  |  Size: 548 B

Some files were not shown because too many files have changed in this diff Show More