mirror of
https://github.com/house-of-abbey/GarminHomeAssistant.git
synced 2025-09-15 13:31:31 +00:00
Compare commits
11 Commits
f224268554
...
v3.1
Author | SHA1 | Date | |
---|---|---|---|
|
46740fac76 | ||
|
649f0f250d | ||
|
5a0bd98ddb | ||
|
ce81c6af0a | ||
|
3d7b588d2c | ||
|
166b5f4ec3 | ||
|
57128bf7a4 | ||
|
64bebded0a | ||
|
b9db9af3bf | ||
|
ad7d278072 | ||
|
dd484aa615 |
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@@ -4,6 +4,8 @@
|
||||
"Venu"
|
||||
],
|
||||
"files.exclude": {
|
||||
"resources-*": true
|
||||
"resources-*": true,
|
||||
"bin": true,
|
||||
"export": true
|
||||
}
|
||||
}
|
@@ -46,4 +46,4 @@
|
||||
| 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. |
|
||||
| 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. |
|
||||
|
@@ -2,20 +2,24 @@
|
||||
|
||||
# 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 the solution is generic enough for other use cases.
|
||||
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.
|
||||
|
||||
Please let us know if this solution is found to be useful for other situations.
|
||||
|
||||
## Setup
|
||||
|
||||
The main settings includes a sub-menu for the user supplied HTTP header.
|
||||
|
||||
<img src="images/http_header_submenu_item.png" width="400" title="Application Settings"/>
|
||||
|
||||
The sub-menu contains two options for users to specify both the HTTP header name and the value as two free form strings.
|
||||
The settings contain two options for users to specify both the HTTP header name and the value as two free form strings.
|
||||
|
||||
<img src="images/http_header_settings.png" width="400" title="Application Settings"/>
|
||||
|
||||
If you don't know why you need these, leave them empty and ignore.
|
||||
|
||||
### Cloudflare WAF rule example
|
||||
|
||||
`(any(http.request.headers["your-header-name"][*] eq "your-header-key"))`
|
||||
|
||||
Make the key strong enough!
|
||||
|
||||
## Support
|
||||
|
||||
**None!**
|
||||
@@ -25,3 +29,9 @@ The authors of the Garmin Home Assistant application do not use, and hence do no
|
||||
## Credits
|
||||
|
||||
With thanks to Lars Pöpperl ([@tispokes](https://github.com/tispokes)) for contributing to this solution.
|
||||
|
||||
|
||||
## 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)
|
@@ -17,6 +17,8 @@ The application is designed around a simple scrollable menu where menu items hav
|
||||
> [!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.
|
||||
>
|
||||
>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.)
|
||||
>
|
||||
> 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.
|
||||
@@ -230,7 +232,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 -> 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 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.
|
||||
|
||||

|
||||
|
||||
|
2
Wi-Fi.md
2
Wi-Fi.md
@@ -40,4 +40,4 @@ We emphasize that the Wi-Fi/LTE functionality should be viewed as a 'last resort
|
||||
|
||||
## Credits
|
||||
|
||||
With thanks to [@vincentezw](https://github.com/vincentezw) for contributing this solution.
|
||||
With thanks to Vincent, [@vincentezw](https://github.com/vincentezw) for contributing this solution, and to Ali Alaei, [@aalaei](https://github.com/aalaei) for the finer details on TLS.
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 680 KiB After Width: | Height: | Size: 557 KiB |
Binary file not shown.
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 34 KiB |
Binary file not shown.
Before Width: | Height: | Size: 15 KiB |
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">عنوان URL لتكوين القائمة (JSON).</string>
|
||||
<string id="SettingsCacheConfig">هل يجب أن يقوم تطبيق ذاكرة التخزين المؤقت لتكوين القائمة؟</string>
|
||||
<string id="SettingsClearCache">هل يجب على التطبيق مسح ذاكرة التخزين المؤقت الموجودة في المرة القادمة التي يتم فيها بدء تشغيلها؟</string>
|
||||
<string id="WifiLteExecution">وضع تنفيذ Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">تمكين تنفيذ الأوامر على Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">يسمح للتطبيق بالبدء بدون اتصال الهاتف (عند تخزين القائمة) ، والمطالبة بتنفيذ الأمر عبر Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">هل يجب أن يقدم التطبيق ملاحظات عبر الاهتزازات؟</string>
|
||||
<string id="SettingsAppTimeout">مهلة في ثوان. الخروج من التطبيق بعد هذه الفترة من عدم النشاط لحفظ بطارية الجهاز.</string>
|
||||
<string id="SettingsPollDelay">تأخير استطلاع إضافي (بالثواني). يضيف تأخيرًا بين تحديث الحالة لجميع عناصر القائمة.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL за конфигуриране на менюто (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Трябва ли приложението да кешира конфигурацията на менюто?</string>
|
||||
<string id="SettingsClearCache">Трябва ли приложението да изчисти съществуващия кеш следващия път, когато е стартиран?</string>
|
||||
<string id="WifiLteExecution">Режим на изпълнение на Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Активиране на изпълнение на команди над Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Позволява на приложението да стартира без телефонна връзка (когато менюто е кеширано) и подкана за изпълнение на команда през Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Трябва ли приложението да предоставя обратна връзка чрез вибрации?</string>
|
||||
<string id="SettingsAppTimeout">Време за изчакване за секунди. Излезте от приложението след този период на бездействие, за да запазите батерията на устройството.</string>
|
||||
<string id="SettingsPollDelay">Допълнително забавяне на анкетата (за секунди). Добавя забавяне между актуализацията на състоянието на всички елементи от менюто.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Režim provádění Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Povolit provádění příkazů přes Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Umožňuje aplikaci začít bez telefonu (když je nabídka v mezipaměti) a výzva k provedení příkazu 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL til menukonfiguration (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Skal applikationscache menuen Konfiguration?</string>
|
||||
<string id="SettingsClearCache">Bør applikationen rydde den eksisterende cache næste gang den startes?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE-eksekveringstilstand.</string>
|
||||
<string id="WifiLteExecutionEnable">Aktivér udførelse af kommandoer over Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Tillader appen at starte uden telefonforbindelse (når menuen er cache) og beder om at udføre kommando 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>
|
||||
|
@@ -59,9 +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="WifiLteExecution">Ausführung über WLAN-/LTE einschalten.</string>
|
||||
<string id="WifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
|
||||
<string id="WifiLteExecutionDescription">Ermöglicht das Starten der App ohne Telefonverbindung (bei zwischengespeichertem Menü) und fragt, ob der Befehl über WLAN/LTE ausgeführt werden soll.</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>
|
||||
|
@@ -62,9 +62,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="WifiLteExecution">Ausführung über WLAN-/LTE einschalten.</string>
|
||||
<string id="WifiLteExecutionEnable">Befehlsausführung über WLAN/LTE aktivieren.</string>
|
||||
<string id="WifiLteExecutionDescription">Ermöglicht das Starten der App ohne Telefonverbindung (bei zwischengespeichertem Menü) und fragt, ob der Befehl über WLAN/LTE ausgeführt werden soll.</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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Wi-Fi/LTE-uitvoeringsmodus.</string>
|
||||
<string id="WifiLteExecutionEnable">Schakel opdrachten uit via Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Hiermee kan de app starten zonder telefoonverbinding (wanneer het menu in de cache wordt opgeslagen) en de opdracht uitvoeren via Wi-Fi/LTE uit te voeren.</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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Wi-Fi/LTE täitmisrežiim.</string>
|
||||
<string id="WifiLteExecutionEnable">Luba käskude täitmine Wi-Fi/LTE kaudu.</string>
|
||||
<string id="WifiLteExecutionDescription">Võimaldab rakendusel käivitada ilma telefoniühenduseta (kui menüü on vahemällu salvestatud) ja vihje käsu käivitamiseks 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Wi-Fi/LTE-suoritustila.</string>
|
||||
<string id="WifiLteExecutionEnable">Ota komentojen suorittaminen käyttöön Wi-Fi/LTE: n kautta.</string>
|
||||
<string id="WifiLteExecutionDescription">Mahdollistaa sovelluksen käynnistyksen ilman puhelinyhteyttä (kun valikko on välimuisti) ja kehottaa suorittamaan komento Wi-Fi/LTE: n 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Mode d'exécution Wi-Fi / LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Activer l'exécution des commandes sur Wi-Fi / LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Permet à l'application de démarrer sans connexion par téléphone (lorsque le menu est mis en cache) et invite à exécuter la commande via 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL για διαμόρφωση μενού (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Πρέπει η προσωρινή μνήμη εφαρμογής τη διαμόρφωση μενού;</string>
|
||||
<string id="SettingsClearCache">Πρέπει η εφαρμογή να διαγράψει την υπάρχουσα μνήμη cache την επόμενη φορά που θα ξεκινήσει;</string>
|
||||
<string id="WifiLteExecution">Λειτουργία εκτέλεσης Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Ενεργοποιήστε τις εντολές εκτέλεσης μέσω Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Επιτρέπει στην εφαρμογή να ξεκινά χωρίς σύνδεση τηλεφώνου (όταν το μενού αποθηκεύεται προσωρινά) και προτρέπεται να εκτελέσει εντολή μέσω Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Πρέπει η εφαρμογή να παρέχει ανατροφοδότηση μέσω δονήσεων;</string>
|
||||
<string id="SettingsAppTimeout">Χρονικό όριο σε δευτερόλεπτα. Βγείτε από την εφαρμογή μετά από αυτήν την περίοδο αδράνειας για να αποθηκεύσετε τη μπαταρία της συσκευής.</string>
|
||||
<string id="SettingsPollDelay">Πρόσθετη καθυστέρηση δημοσκόπησης (σε δευτερόλεπτα). Προσθέτει μια καθυστέρηση μεταξύ της ενημέρωσης κατάστασης όλων των στοιχείων μενού.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">כתובת אתר לתצורת תפריט (JSON).</string>
|
||||
<string id="SettingsCacheConfig">האם על היישום למנוע את תצורת התפריט?</string>
|
||||
<string id="SettingsClearCache">האם על היישום לנקות את המטמון הקיים בפעם הבאה שהוא מתחיל?</string>
|
||||
<string id="WifiLteExecution">מצב ביצוע Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">אפשר לבצע פקודות דרך Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">מאפשר לאפליקציה להתחיל ללא חיבור טלפון (כאשר התפריט מטמון), ולבקש לבצע פקודה דרך Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">האם על היישום לספק משוב באמצעות תנודות?</string>
|
||||
<string id="SettingsAppTimeout">פסק זמן בשניות. צא מהיישום לאחר תקופת חוסר פעילות זו כדי לחסוך את סוללת ההתקן.</string>
|
||||
<string id="SettingsPollDelay">עיכוב נוסף בסקר (תוך שניות). מוסיף עיכוב בין עדכון הסטטוס של כל פריטי התפריט.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Wi-Fi/LTE izvedbe.</string>
|
||||
<string id="WifiLteExecutionEnable">Omogući izvršavanje naredbi preko Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Omogućuje aplikaciji da se pokrene bez telefonske veze (kada je izbornik predmemoran) i zatražite izvršavanje naredbe preko 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<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="WifiLteExecution">Wi-Fi/LTE végrehajtási mód.</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="WifiLteExecutionDescription">Lehetővé teszi az alkalmazás számára, hogy telefonkapcsolat nélkül induljon (amikor a menü gyorsítótárban van), és kérje a parancsot a Wi-Fi/LTE-en 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>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL untuk Konfigurasi Menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Haruskah Aplikasi Menyimpan Konfigurasi Menu?</string>
|
||||
<string id="SettingsClearCache">Haruskah aplikasi menghapus cache yang ada lain kali dimulai?</string>
|
||||
<string id="WifiLteExecution">Mode Eksekusi Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Aktifkan Perintah yang Mengeksekusi melalui Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Memungkinkan aplikasi untuk memulai tanpa koneksi telepon (saat menu di-cache), dan meminta untuk menjalankan perintah melalui Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Haruskah aplikasi memberikan umpan balik melalui getaran?</string>
|
||||
<string id="SettingsAppTimeout">Batas waktu dalam hitungan detik. Keluar dari aplikasi setelah periode tidak aktif ini untuk menyimpan baterai perangkat.</string>
|
||||
<string id="SettingsPollDelay">Penundaan jajak pendapat tambahan (dalam hitungan detik). Menambahkan penundaan antara pembaruan status semua item menu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL per la configurazione del menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">L'applicazione dovrebbe memorizzare la cache della configurazione del menu?</string>
|
||||
<string id="SettingsClearCache">L'applicazione dovrebbe cancellare la cache esistente la prossima volta che viene avviata?</string>
|
||||
<string id="WifiLteExecution">Modalità di esecuzione Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Abilita l'esecuzione dei comandi su Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Consente all'app di avviare senza connessione telefonica (quando il menu è memorizzato nella cache) e prompt di eseguire il comando tramite Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">L'applicazione dovrebbe fornire feedback tramite vibrazioni?</string>
|
||||
<string id="SettingsAppTimeout">Timeout in secondi. Esci dall'applicazione dopo questo periodo di inattività per salvare la batteria del dispositivo.</string>
|
||||
<string id="SettingsPollDelay">Ritardo del sondaggio aggiuntivo (in secondi). Aggiunge un ritardo tra l'aggiornamento dello stato di tutte le voci di menu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">メニュー構成用のURL(JSON)。</string>
|
||||
<string id="SettingsCacheConfig">アプリケーションはメニュー構成をキャッシュする必要がありますか?</string>
|
||||
<string id="SettingsClearCache">次回開始時にアプリケーションが既存のキャッシュをクリアする必要がありますか?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE実行モード。</string>
|
||||
<string id="WifiLteExecutionEnable">Wi-Fi/LTEを介してコマンドを実行できるようにします。</string>
|
||||
<string id="WifiLteExecutionDescription">電話接続なしでアプリを起動することができます(メニューがキャッシュされている場合)、Wi-Fi/LTEを介してコマンドを実行するように求められます。</string>
|
||||
<string id="SettingsVibration">アプリケーションは振動を介してフィードバックを提供する必要がありますか?</string>
|
||||
<string id="SettingsAppTimeout">数秒でタイムアウト。デバイスバッテリーを保存するために、この不活性期間の後にアプリケーションを終了します。</string>
|
||||
<string id="SettingsPollDelay">追加の投票遅延(秒単位)。すべてのメニュー項目のステータス更新間に遅延を追加します。</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">메뉴 구성 (JSON) 용 URL.</string>
|
||||
<string id="SettingsCacheConfig">응용 프로그램이 메뉴 구성을 캐시해야합니까?</string>
|
||||
<string id="SettingsClearCache">다음에 시작될 때 응용 프로그램이 기존 캐시를 지우려면?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE 실행 모드.</string>
|
||||
<string id="WifiLteExecutionEnable">Wi-Fi/LTE를 통해 명령을 실행할 수 있습니다.</string>
|
||||
<string id="WifiLteExecutionDescription">전화 연결없이 앱을 시작할 수 있으며 (메뉴가 캐시 될 때) Wi-Fi/LTE를 통해 명령을 실행하라는 메시지가 표시됩니다.</string>
|
||||
<string id="SettingsVibration">응용 프로그램이 진동을 통해 피드백을 제공해야합니까?</string>
|
||||
<string id="SettingsAppTimeout">시간 초과 시간 초과. 장치 배터리를 저장하기 위해이 비활성 기간 후에 응용 프로그램을 종료하십시오.</string>
|
||||
<string id="SettingsPollDelay">추가 폴링 지연 (초). 모든 메뉴 항목의 상태 업데이트 사이에 지연이 추가됩니다.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL izvēlnes konfigurācijai (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Vai lietojumprogrammai vajadzētu kešatmiņā izvēlnes konfigurāciju?</string>
|
||||
<string id="SettingsClearCache">Vai lietojumprogrammai vajadzētu notīrīt esošo kešatmiņu nākamreiz, kad tā tiks sākta?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE izpildes režīms.</string>
|
||||
<string id="WifiLteExecutionEnable">Iespējot izpildīt komandas, izmantojot Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Ļauj lietotnei sākt bez tālruņa savienojuma (kad izvēlne ir kešatmiņā) un uzvedne izpildīt komandu, izmantojot Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Vai lietojumprogrammai vajadzētu sniegt atgriezenisko saiti, izmantojot vibrācijas?</string>
|
||||
<string id="SettingsAppTimeout">Noildze sekundēs. Izejiet no lietojumprogrammas pēc šī bezdarbības perioda, lai saglabātu ierīces akumulatoru.</string>
|
||||
<string id="SettingsPollDelay">Papildu aptaujas kavēšanās (sekundēs). Pievieno kavēšanos starp visu izvēlnes vienumu statusa atjauninājumu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL meniu konfigūracijai (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Ar programos talpykla turėtų talpinti meniu konfigūraciją?</string>
|
||||
<string id="SettingsClearCache">Ar programa turėtų išvalyti esamą talpyklą kitą kartą, kai ji bus paleista?</string>
|
||||
<string id="WifiLteExecution">„Wi-Fi“/LTE vykdymo režimas.</string>
|
||||
<string id="WifiLteExecutionEnable">Įgalinti komandas vykdant „Wi-Fi“/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Leidžia programai paleisti be telefono ryšio (kai meniu yra talpykloje), ir raginkite vykdyti komandą per „Wi-Fi/LTE“.</string>
|
||||
<string id="SettingsVibration">Ar programa turėtų pateikti grįžtamąjį ryšį per vibracijas?</string>
|
||||
<string id="SettingsAppTimeout">Laikas per kelias sekundes. Išeikite iš programos po šio neveiklumo laikotarpio, kad išsaugotumėte įrenginio akumuliatorių.</string>
|
||||
<string id="SettingsPollDelay">Papildomas apklausos vėlavimas (per kelias sekundes). Prideda vėlavimą tarp visų meniu elementų būsenos atnaujinimo.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL for menykonfigurasjon (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Bør applikasjonsbufferen menykonfigurasjonen?</string>
|
||||
<string id="SettingsClearCache">Bør applikasjonen fjerne den eksisterende cachen neste gang den startes?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE utførelsesmodus.</string>
|
||||
<string id="WifiLteExecutionEnable">Aktiver utførende kommandoer over Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Lar appen starte uten telefonforbindelse (når menyen er hurtigbufret), og be om å utføre kommando over Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Bør applikasjonen gi tilbakemelding via vibrasjoner?</string>
|
||||
<string id="SettingsAppTimeout">Tidsavbrudd på sekunder. Gå ut av applikasjonen etter denne perioden med inaktivitet for å lagre enhetsbatteriet.</string>
|
||||
<string id="SettingsPollDelay">Ytterligere avstemningsforsinkelse (på sekunder). Legger til en forsinkelse mellom statusoppdateringen av alle menyelementer.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL dla konfiguracji menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Czy aplikacja powinna buforować konfigurację menu?</string>
|
||||
<string id="SettingsClearCache">Czy aplikacja powinna wyczyścić istniejącą pamięć podręczną następnym razem, gdy zostanie uruchomiona?</string>
|
||||
<string id="WifiLteExecution">Tryb wykonania Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Włącz wykonywanie poleceń przez Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Umożliwia aplikację uruchamianie bez połączenia telefonicznego (gdy menu jest buforowane) i monit o wykonanie polecenia przez Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Czy aplikacja powinna przekazywać informacje zwrotne za pośrednictwem wibracji?</string>
|
||||
<string id="SettingsAppTimeout">Limit czasu w sekundach. Wyjdź z aplikacji po tym okresie bezczynności, aby zapisać akumulator urządzenia.</string>
|
||||
<string id="SettingsPollDelay">Dodatkowe opóźnienie ankiety (w sekundach). Dodaje opóźnienie między aktualizacją statusu wszystkich elementów menu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL para configuração de menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">O aplicativo deve cache a configuração do menu?</string>
|
||||
<string id="SettingsClearCache">O aplicativo deve limpar o cache existente na próxima vez que for iniciado?</string>
|
||||
<string id="WifiLteExecution">Modo de execução Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Habilite os comandos de execução sobre Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Permite que o aplicativo inicie sem conexão de telefone (quando o menu é armazenado em cache) e solicite a execução do comando sobre Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">O aplicativo deve fornecer feedback por meio de vibrações?</string>
|
||||
<string id="SettingsAppTimeout">Tempo limite em segundos. Saia do aplicativo após esse período de inatividade para salvar a bateria do dispositivo.</string>
|
||||
<string id="SettingsPollDelay">Atraso adicional da pesquisa (em segundos). Adiciona um atraso entre a atualização de status de todos os itens do menu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL pentru configurația meniului (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Aplicația cache ar trebui să fie configurația meniului?</string>
|
||||
<string id="SettingsClearCache">Aplicația ar trebui să șterge cache -ul existent data viitoare când va fi pornită?</string>
|
||||
<string id="WifiLteExecution">Modul de execuție Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Activați executarea comenzilor prin Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Permite aplicației să înceapă fără conexiune telefonică (când meniul este în cache) și solicită să execute comanda prin Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Aplicația ar trebui să ofere feedback prin vibrații?</string>
|
||||
<string id="SettingsAppTimeout">Timeout în câteva secunde. Ieșiți din aplicație după această perioadă de inactivitate pentru a economisi bateria dispozitivului.</string>
|
||||
<string id="SettingsPollDelay">Întârziere suplimentară a sondajului (în secunde). Adăugă o întârziere între actualizarea de stare a tuturor elementelor din meniu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL pre konfiguráciu ponuky (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Mala by sa aplikácia vyrovnávať konfiguráciu ponuky?</string>
|
||||
<string id="SettingsClearCache">Mala by aplikácia vymazať existujúcu vyrovnávaciu pamäť nabudúce, keď sa začne?</string>
|
||||
<string id="WifiLteExecution">Režim vykonávania Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Povoliť vykonávanie príkazov cez Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Umožňuje aplikácii spustiť bez pripojenia telefónu (keď je ponuka ukladaná do vyrovnávacej pamäte) a výzva na vykonanie príkazu cez Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Mala by aplikácia poskytovať spätnú väzbu prostredníctvom vibrácií?</string>
|
||||
<string id="SettingsAppTimeout">Časový limit v sekundách. Opustite aplikáciu po tomto období nečinnosti, aby ste uložili batériu zariadenia.</string>
|
||||
<string id="SettingsPollDelay">Ďalšie oneskorenie ankety (v sekundách). Pridáva oneskorenie medzi aktualizáciou stavu všetkých položiek ponuky.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL za konfiguracijo menija (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Ali naj aplikacija predpomni konfiguracija menija?</string>
|
||||
<string id="SettingsClearCache">Ali bi morala aplikacija očistiti obstoječi predpomnilnik naslednjič, ko se začne?</string>
|
||||
<string id="WifiLteExecution">Način izvedbe Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Omogoči izvajanje ukazov prek Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Omogoča, da se aplikacija zažene brez telefonske povezave (ko je meni predpomnjen), in poziva, da izvede ukaz prek Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Ali bi morala aplikacija posredovati povratne informacije z vibracijami?</string>
|
||||
<string id="SettingsAppTimeout">Časovna omejitev v nekaj sekundah. Po tem obdobju neaktivnosti zapustite aplikacijo, da shranite baterijo naprave.</string>
|
||||
<string id="SettingsPollDelay">Dodatna zamuda ankete (v sekundah). Doda zamudo med posodobitvijo stanja vseh elementov menija.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL para la configuración del menú (JSON).</string>
|
||||
<string id="SettingsCacheConfig">¿Debería la aplicación almacenar en caché la configuración del menú?</string>
|
||||
<string id="SettingsClearCache">¿Debería la aplicación borrar el caché existente la próxima vez que se inicie?</string>
|
||||
<string id="WifiLteExecution">Modo de ejecución Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Habilite la ejecución de comandos sobre Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Permite que la aplicación comience sin conexión del teléfono (cuando el menú se almacena en caché) y solicite ejecutar el comando a través de Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">¿Debería la aplicación proporcionar comentarios a través de vibraciones?</string>
|
||||
<string id="SettingsAppTimeout">Tiempo de espera en segundos. Salga de la aplicación después de este período de inactividad para guardar la batería del dispositivo.</string>
|
||||
<string id="SettingsPollDelay">Retraso de encuesta adicional (en segundos). Agrega un retraso entre la actualización de estado de todos los elementos del menú.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL för menykonfiguration (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Bör applikationen cache menykonfigurationen?</string>
|
||||
<string id="SettingsClearCache">Bör applikationen rensa den befintliga cachen nästa gång den startas?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE exekveringsläge.</string>
|
||||
<string id="WifiLteExecutionEnable">Aktivera körkommandon över Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Tillåter appen att starta utan telefonanslutning (när menyn är cachad) och uppmanas att köra kommando över Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Bör applikationen ge feedback via vibrationer?</string>
|
||||
<string id="SettingsAppTimeout">Timeout på några sekunder. Exit the application after this period of inactivity to save the device battery.</string>
|
||||
<string id="SettingsPollDelay">Ytterligare undersökningsfördröjning (på några sekunder). Lägger till en försening mellan statusuppdateringen av alla menyalternativ.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL สำหรับการกำหนดค่าเมนู (JSON)</string>
|
||||
<string id="SettingsCacheConfig">แอปพลิเคชันควรแคชการกำหนดค่าเมนูหรือไม่?</string>
|
||||
<string id="SettingsClearCache">แอปพลิเคชันควรล้างแคชที่มีอยู่ครั้งต่อไปในครั้งต่อไปหรือไม่</string>
|
||||
<string id="WifiLteExecution">โหมดการดำเนินการ Wi-Fi/LTE</string>
|
||||
<string id="WifiLteExecutionEnable">เปิดใช้งานการดำเนินการคำสั่งผ่าน Wi-Fi/LTE</string>
|
||||
<string id="WifiLteExecutionDescription">อนุญาตให้แอปเริ่มต้นโดยไม่ต้องเชื่อมต่อโทรศัพท์ (เมื่อเมนูถูกแคช) และแจ้งให้เรียกใช้คำสั่งผ่าน Wi-Fi/LTE</string>
|
||||
<string id="SettingsVibration">แอปพลิเคชันควรให้ข้อเสนอแนะผ่านการสั่นสะเทือนหรือไม่?</string>
|
||||
<string id="SettingsAppTimeout">หมดเวลาในไม่กี่วินาที ออกจากแอปพลิเคชันหลังจากช่วงเวลาที่ไม่มีการใช้งานเพื่อประหยัดแบตเตอรี่อุปกรณ์</string>
|
||||
<string id="SettingsPollDelay">ความล่าช้าในการสำรวจเพิ่มเติม (ในไม่กี่วินาที) เพิ่มความล่าช้าระหว่างการอัปเดตสถานะของรายการเมนูทั้งหมด</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">Menü yapılandırması için URL (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Uygulama menü yapılandırmasını önbelleğe almalı mı?</string>
|
||||
<string id="SettingsClearCache">Uygulama bir dahaki sefere başladığında mevcut önbelleği temizlemeli mi?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE Yürütme Modu.</string>
|
||||
<string id="WifiLteExecutionEnable">Wi-Fi/LTE üzerinden komutların yürütülmesini etkinleştirin.</string>
|
||||
<string id="WifiLteExecutionDescription">Uygulamanın telefon bağlantısı olmadan (menü önbelleğe alındığında) başlamasına izin verir ve Wi-Fi/LTE üzerinden komutu yürütme istemek.</string>
|
||||
<string id="SettingsVibration">Uygulama titreşimlerle geri bildirim sağlamalı mı?</string>
|
||||
<string id="SettingsAppTimeout">Saniyeler içinde zaman aşımı. Cihaz bataryasını kaydetmek için bu hareketsizlik döneminden sonra uygulamadan çıkın.</string>
|
||||
<string id="SettingsPollDelay">Ek anket gecikmesi (saniyeler içinde). Tüm menü öğelerinin durum güncellemesi arasında bir gecikme ekler.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL -адреса для конфігурації меню (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Чи повинен додатковий кеш конфігурації меню?</string>
|
||||
<string id="SettingsClearCache">Чи повинен програма очистити існуючий кеш наступного разу, коли він буде запущений?</string>
|
||||
<string id="WifiLteExecution">Режим виконання Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Увімкнути виконання команд над Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Дозволяє додаток починати без підключення до телефону (коли меню кешовано) та підказка виконувати команду через Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Чи повинен програма надавати зворотній зв'язок через вібрації?</string>
|
||||
<string id="SettingsAppTimeout">Тайм -аут за лічені секунди. Вийдіть із програми після цього періоду бездіяльності, щоб зберегти акумулятор пристрою.</string>
|
||||
<string id="SettingsPollDelay">Додаткова затримка опитування (за лічені секунди). Додає затримку між оновленням статусу всіх пунктів меню.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL cho cấu hình menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Bộ đệm ứng dụng có nên cấu hình menu không?</string>
|
||||
<string id="SettingsClearCache">Ứng dụng có nên xóa bộ đệm hiện tại vào lần tới khi nó được bắt đầu không?</string>
|
||||
<string id="WifiLteExecution">Chế độ thực hiện Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Bật các lệnh thực thi qua Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Cho phép ứng dụng bắt đầu mà không cần kết nối điện thoại (khi menu được lưu trữ) và nhắc nhở thực thi lệnh qua Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Ứng dụng có nên cung cấp phản hồi thông qua các rung động?</string>
|
||||
<string id="SettingsAppTimeout">Thời gian chờ trong giây. Thoát khỏi ứng dụng sau khoảng thời gian không hoạt động để lưu pin thiết bị.</string>
|
||||
<string id="SettingsPollDelay">Độ trễ thăm dò ý kiến bổ sung (tính bằng giây). Thêm độ trễ giữa bản cập nhật trạng thái của tất cả các mục menu.</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">菜单配置的URL(JSON)。</string>
|
||||
<string id="SettingsCacheConfig">应用程序缓存菜单配置应该缓存吗?</string>
|
||||
<string id="SettingsClearCache">应用程序下次启动时是否应该清除现有的高速缓存?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE执行模式。</string>
|
||||
<string id="WifiLteExecutionEnable">在Wi-Fi/LTE上启用执行命令。</string>
|
||||
<string id="WifiLteExecutionDescription">允许该应用在没有电话连接的情况下启动(菜单被缓存时),并提示通过Wi-Fi/LTE执行命令。</string>
|
||||
<string id="SettingsVibration">应用程序是否应该通过振动提供反馈?</string>
|
||||
<string id="SettingsAppTimeout">超时几秒钟。在此不活动期间退出应用程序以节省设备电池。</string>
|
||||
<string id="SettingsPollDelay">额外的民意调查延迟(以秒为单位)。在所有菜单项的状态更新之间添加延迟。</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">菜單配置的URL(JSON)。</string>
|
||||
<string id="SettingsCacheConfig">應用程序緩存菜單配置應該緩存嗎?</string>
|
||||
<string id="SettingsClearCache">應用程序下次啟動時是否應該清除現有的高速緩存?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE執行模式。</string>
|
||||
<string id="WifiLteExecutionEnable">在Wi-Fi/LTE上啟用執行命令。</string>
|
||||
<string id="WifiLteExecutionDescription">允許該應用在沒有電話連接的情況下啟動(菜單被緩存時),並提示通過Wi-Fi/LTE執行命令。</string>
|
||||
<string id="SettingsVibration">應用程序是否應該通過振動提供反饋?</string>
|
||||
<string id="SettingsAppTimeout">超時幾秒鐘。在此不活動期間退出應用程序以節省設備電池。</string>
|
||||
<string id="SettingsPollDelay">額外的民意調查延遲(以秒為單位)。在所有菜單項的狀態更新之間添加延遲。</string>
|
||||
|
@@ -62,9 +62,7 @@
|
||||
<string id="SettingsConfigUrl">URL untuk Konfigurasi Menu (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Sekiranya aplikasi cache konfigurasi menu?</string>
|
||||
<string id="SettingsClearCache">Sekiranya permohonan membersihkan cache yang sedia ada pada masa akan datang, ia bermula?</string>
|
||||
<string id="WifiLteExecution">Mod pelaksanaan Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionEnable">Dayakan perintah melaksanakan melalui Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Membolehkan aplikasi bermula tanpa sambungan telefon (apabila menu di-cache), dan segera untuk melaksanakan perintah melalui Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Sekiranya permohonan memberikan maklum balas melalui getaran?</string>
|
||||
<string id="SettingsAppTimeout">Tamat masa dalam beberapa saat. Keluar dari permohonan selepas tempoh tidak aktif ini untuk menyimpan bateri peranti.</string>
|
||||
<string id="SettingsPollDelay">Kelewatan tinjauan tambahan (dalam saat). Menambah kelewatan antara kemas kini status semua item menu.</string>
|
||||
|
@@ -18,7 +18,7 @@
|
||||
title="@Strings.SettingsApiKey"
|
||||
prompt="@Strings.SettingsApiKeyPrompt"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
<settingConfig type="alphaNumeric" required="true" />
|
||||
</setting>
|
||||
|
||||
<setting
|
||||
@@ -26,7 +26,7 @@
|
||||
title="@Strings.SettingsApiUrl"
|
||||
prompt="https://homeassistant.local/api"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
<settingConfig type="alphaNumeric" required="true" />
|
||||
</setting>
|
||||
|
||||
<setting
|
||||
@@ -34,7 +34,7 @@
|
||||
title="@Strings.SettingsConfigUrl"
|
||||
prompt="https://homeassistant.local/local/garmin/menu.json"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
<settingConfig type="alphaNumeric" required="true" />
|
||||
</setting>
|
||||
|
||||
<setting
|
||||
@@ -51,14 +51,12 @@
|
||||
<settingConfig type="boolean" />
|
||||
</setting>
|
||||
|
||||
<group enableIfTrue="@Properties.cache_config" id="wifiLteExection" title="@Strings.WifiLteExecution" description="@Strings.WifiLteExecutionDescription">
|
||||
<setting
|
||||
propertyKey="@Properties.wifi_lte_execution"
|
||||
title="@Strings.WifiLteExecutionEnable"
|
||||
>
|
||||
<settingConfig type="boolean" />
|
||||
</setting>
|
||||
</group>
|
||||
|
||||
<setting
|
||||
propertyKey="@Properties.enable_vibration"
|
||||
@@ -92,7 +90,7 @@
|
||||
propertyKey="@Properties.pin"
|
||||
title="@Strings.SettingsPin"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
<settingConfig type="alphaNumeric" maxLength="4" />
|
||||
</setting>
|
||||
|
||||
<setting
|
||||
@@ -119,22 +117,22 @@
|
||||
<settingConfig type="numeric" min="5" />
|
||||
</setting>
|
||||
|
||||
<group id="userHttpHeader" title="@Strings.SettingsUserHttpHeader" description="@Strings.SettingsUserHttpHeaderDescription">
|
||||
<setting
|
||||
propertyKey="@Properties.user_http_header_name"
|
||||
title="@Strings.SettingsUserHttpHeaderName"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
</setting>
|
||||
|
||||
<setting
|
||||
propertyKey="@Properties.user_http_header_value"
|
||||
title="@Strings.SettingsUserHttpHeaderValue"
|
||||
>
|
||||
<settingConfig type="alphaNumeric" />
|
||||
</setting>
|
||||
<!--
|
||||
<group id="userHttpHeader" title="@Strings.SettingsUserHttpHeader" description="@Strings.SettingsUserHttpHeaderDescription">
|
||||
</group>
|
||||
|
||||
-->
|
||||
<setting
|
||||
propertyKey="@Properties.webhook_id"
|
||||
title="@Strings.WebhookId"
|
||||
|
@@ -57,9 +57,7 @@
|
||||
<string id="SettingsConfigUrl">URL for menu configuration (JSON).</string>
|
||||
<string id="SettingsCacheConfig">Should the application cache the menu configuration?</string>
|
||||
<string id="SettingsClearCache">Should the application clear the existing cache next time it is started?</string>
|
||||
<string id="WifiLteExecution">Wi-Fi/LTE execution mode.</string>
|
||||
<string id="WifiLteExecutionEnable">Enable executing commands over Wi-Fi/LTE.</string>
|
||||
<string id="WifiLteExecutionDescription">Allows the app to start without phone connection (when menu is cached), and prompt to execute command over Wi-Fi/LTE.</string>
|
||||
<string id="SettingsVibration">Should the application provide feedback via vibrations?</string>
|
||||
<string id="SettingsAppTimeout">Timeout in seconds. Exit the application after this period of inactivity to save the device battery.</string>
|
||||
<string id="SettingsPollDelay">Additional poll delay (in seconds). Adds a delay between the status update of all menu items.</string>
|
||||
|
@@ -25,8 +25,8 @@ using Toybox.Timer;
|
||||
//
|
||||
(:glance, :background)
|
||||
class HomeAssistantApp extends Application.AppBase {
|
||||
private var mApiStatus as Lang.String?;
|
||||
private var mHasToast as Lang.Boolean = false;
|
||||
private var mApiStatus as Lang.String?;
|
||||
private var mMenuStatus as Lang.String?;
|
||||
private var mHaMenu as HomeAssistantView?;
|
||||
private var mGlanceTemplate as Lang.String? = null;
|
||||
@@ -36,7 +36,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
private var mUpdateTimer as Timer.Timer?;
|
||||
// Array initialised by onReturnFetchMenuConfig()
|
||||
private var mItemsToUpdate as Lang.Array<HomeAssistantToggleMenuItem or HomeAssistantTapMenuItem or HomeAssistantGroupMenuItem>?;
|
||||
private var mIsGlance as Lang.Boolean = false;
|
||||
private var mIsApp as Lang.Boolean = false; // Or Widget
|
||||
private var mUpdating as Lang.Boolean = false; // Don't start a second chain of updates
|
||||
private var mTemplates as Lang.Dictionary = {};
|
||||
@@ -155,7 +154,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//! @param responseCode Response code.
|
||||
//! @param data Response data.
|
||||
//
|
||||
(:glance)
|
||||
function onReturnFetchMenuConfig(
|
||||
responseCode as Lang.Number,
|
||||
data as Null or Lang.Dictionary or Lang.String
|
||||
@@ -168,35 +166,35 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
case Communications.BLE_HOST_TIMEOUT:
|
||||
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoPhone) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.BLE_QUEUE_FULL:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiFlood) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoResponse) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case 404:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound) as Lang.String);
|
||||
}
|
||||
break;
|
||||
@@ -212,7 +210,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Available) as Lang.String;
|
||||
}
|
||||
}
|
||||
if (mIsGlance) {
|
||||
if (!mIsApp) {
|
||||
glanceTemplate(data);
|
||||
} else {
|
||||
if (data == null) {
|
||||
@@ -226,7 +224,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
|
||||
default:
|
||||
// System.println("HomeAssistantApp onReturnFetchMenuConfig(): Unhandled HTTP response code = " + responseCode);
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode);
|
||||
}
|
||||
break;
|
||||
@@ -251,7 +249,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//! @return Return true if the menu came from the cache, otherwise false. This is because fetching
|
||||
//! the menu when not in the cache is asynchronous and affects how the views are managed.
|
||||
//
|
||||
(:glance)
|
||||
function fetchMenuConfig() as Lang.Boolean {
|
||||
// System.println("Menu URL = " + Settings.getConfigUrl());
|
||||
if (Settings.getConfigUrl().equals("")) {
|
||||
@@ -275,7 +272,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
errorRez = $.Rez.Strings.Unavailable;
|
||||
}
|
||||
// System.println("HomeAssistantApp fetchMenuConfig(): No Phone connection, skipping API call.");
|
||||
if (mIsGlance) {
|
||||
if (!mIsApp) {
|
||||
WatchUi.requestUpdate();
|
||||
} else {
|
||||
ErrorView.show(WatchUi.loadResource(errorRez) as Lang.String);
|
||||
@@ -296,7 +293,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
} else {
|
||||
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Cached) as Lang.String;
|
||||
WatchUi.requestUpdate();
|
||||
if (mIsGlance) {
|
||||
if (!mIsApp) {
|
||||
glanceTemplate(menu);
|
||||
} else {
|
||||
buildMenu(menu);
|
||||
@@ -430,6 +427,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//! Construct the GET request to update all menu items.
|
||||
//
|
||||
function updateMenuItems() as Void {
|
||||
if (mUpdating) {
|
||||
var phoneConnected = System.getDeviceSettings().phoneConnected;
|
||||
var connectionAvailable = System.getDeviceSettings().connectionAvailable;
|
||||
|
||||
@@ -511,13 +509,13 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//! Callback function after completing the GET request to fetch the API status.
|
||||
//!
|
||||
//! @param responseCode Response code.
|
||||
//! @param data Response data.
|
||||
//
|
||||
(:glance)
|
||||
function onReturnFetchApiStatus(
|
||||
responseCode as Lang.Number,
|
||||
data as Null or Lang.Dictionary or Lang.String
|
||||
@@ -530,35 +528,35 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
case Communications.BLE_HOST_TIMEOUT:
|
||||
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoPhone) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.BLE_QUEUE_FULL:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiFlood) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoResponse) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case 404:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: 404, page not found. Check Configuration URL setting.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound) as Lang.String);
|
||||
}
|
||||
break;
|
||||
@@ -567,7 +565,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
if ((data != null) && data.get("message").equals("API running.")) {
|
||||
mApiStatus = WatchUi.loadResource($.Rez.Strings.Available) as Lang.String;
|
||||
} else {
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show("API " + mApiStatus + ".");
|
||||
}
|
||||
}
|
||||
@@ -575,7 +573,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
|
||||
default:
|
||||
// System.println("HomeAssistantApp onReturnFetchApiStatus(): Unhandled HTTP response code = " + responseCode);
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode);
|
||||
}
|
||||
}
|
||||
@@ -584,7 +582,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
|
||||
//! Construct the GET request to test the API status, is it accessible?
|
||||
//
|
||||
(:glance)
|
||||
function fetchApiStatus() as Void {
|
||||
var phoneConnected = System.getDeviceSettings().phoneConnected;
|
||||
var connectionAvailable = System.getDeviceSettings().connectionAvailable;
|
||||
@@ -594,13 +591,13 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
mApiStatus = WatchUi.loadResource($.Rez.Strings.Unconfigured) as Lang.String;
|
||||
WatchUi.requestUpdate();
|
||||
} else {
|
||||
if (! mIsGlance && Settings.getWifiLteExecutionEnabled() && (! phoneConnected || ! connectionAvailable)) {
|
||||
if ( mIsApp && Settings.getWifiLteExecutionEnabled() && (! phoneConnected || ! connectionAvailable)) {
|
||||
// System.println("HomeAssistantApp fetchApiStatus(): In-app Wifi mode (No Phone and Internet connection), early return.");
|
||||
return;
|
||||
} else if (! phoneConnected) {
|
||||
// System.println("HomeAssistantApp fetchApiStatus(): No Phone connection, skipping API call.");
|
||||
mApiStatus = WatchUi.loadResource($.Rez.Strings.Unavailable) as Lang.String;
|
||||
if (mIsGlance) {
|
||||
if (!mIsApp) {
|
||||
WatchUi.requestUpdate();
|
||||
} else {
|
||||
System.println("we here");
|
||||
@@ -609,7 +606,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
} else if (! connectionAvailable) {
|
||||
// System.println("HomeAssistantApp fetchApiStatus(): No Internet connection, skipping API call.");
|
||||
mApiStatus = WatchUi.loadResource($.Rez.Strings.Unavailable) as Lang.String;
|
||||
if (mIsGlance) {
|
||||
if (!mIsApp) {
|
||||
WatchUi.requestUpdate();
|
||||
} else {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoInternet) as Lang.String);
|
||||
@@ -637,7 +634,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//! @param responseCode Response code.
|
||||
//! @param data Response data.
|
||||
//
|
||||
(:glance)
|
||||
function onReturnFetchGlanceContent(
|
||||
responseCode as Lang.Number,
|
||||
data as Null or Lang.Dictionary or Lang.String
|
||||
@@ -649,35 +645,35 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
case Communications.BLE_HOST_TIMEOUT:
|
||||
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoPhone) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.BLE_QUEUE_FULL:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ApiFlood) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.NETWORK_REQUEST_TIMED_OUT:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoResponse) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.NoJson) as Lang.String);
|
||||
}
|
||||
break;
|
||||
|
||||
case 404:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent() Response Code: 404, page not found. Check Configuration URL setting.");
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound) as Lang.String);
|
||||
}
|
||||
break;
|
||||
@@ -690,7 +686,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
|
||||
default:
|
||||
// System.println("HomeAssistantApp onReturnFetchGlanceContent(): Unhandled HTTP response code = " + responseCode);
|
||||
if (!mIsGlance) {
|
||||
if (mIsApp) {
|
||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode);
|
||||
}
|
||||
}
|
||||
@@ -699,7 +695,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
|
||||
//! Construct the GET request to convert the optional glance template to text for display.
|
||||
//
|
||||
(:glance)
|
||||
function fetchGlanceContent() as Void {
|
||||
if (mGlanceTemplate != null) {
|
||||
// https://developers.home-assistant.io/docs/api/native-app-integration/sending-data/#render-templates
|
||||
@@ -737,7 +732,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//!
|
||||
//! @return A string describing the API status
|
||||
//
|
||||
(:glance)
|
||||
function getApiStatus() as Lang.String {
|
||||
return mApiStatus;
|
||||
}
|
||||
@@ -746,7 +740,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//!
|
||||
//! @return A string describing the Menu status
|
||||
//
|
||||
(:glance)
|
||||
function getMenuStatus() as Lang.String {
|
||||
return mMenuStatus;
|
||||
}
|
||||
@@ -756,7 +749,6 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//!
|
||||
//! @return A string derived from the glance template (or null)
|
||||
//
|
||||
(:glance)
|
||||
function getGlanceText() as Lang.String? {
|
||||
return mGlanceText;
|
||||
}
|
||||
@@ -800,7 +792,7 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
//! @return The glance view
|
||||
//
|
||||
function getGlanceView() as [ WatchUi.GlanceView ] or [ WatchUi.GlanceView, WatchUi.GlanceViewDelegate ] or Null {
|
||||
mIsGlance = true;
|
||||
mIsApp = false; // A bit unnecessary given the default
|
||||
mApiStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
|
||||
mMenuStatus = WatchUi.loadResource($.Rez.Strings.Checking) as Lang.String;
|
||||
Settings.update();
|
||||
@@ -824,8 +816,10 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
mGlanceTimer = null;
|
||||
fetchMenuConfig();
|
||||
fetchApiStatus();
|
||||
if (Settings.getWebhookId() != null && !Settings.getWebhookId().equals("")) {
|
||||
fetchGlanceContent();
|
||||
}
|
||||
}
|
||||
|
||||
//! Code for when the application settings are updated.
|
||||
//
|
||||
@@ -842,6 +836,8 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
}
|
||||
|
||||
//! Determine is we are a glance or the full application. Glances should be considered to be separate applications.
|
||||
//!
|
||||
//! @return We are an application (if not we're a glance)
|
||||
//
|
||||
function getIsApp() as Lang.Boolean {
|
||||
return mIsApp;
|
||||
@@ -857,6 +853,8 @@ class HomeAssistantApp extends Application.AppBase {
|
||||
}
|
||||
|
||||
//! Global function to return the application object.
|
||||
//!
|
||||
//! @return The application object.
|
||||
//
|
||||
(:glance, :background)
|
||||
function getApp() as HomeAssistantApp {
|
||||
|
@@ -48,9 +48,9 @@ class Settings {
|
||||
//! minutes
|
||||
private static var mBatteryRefreshRate as Lang.Number = 15;
|
||||
//! Additional user configurable HTTP header key
|
||||
private static var mUserHeaderName as Lang.String = "";
|
||||
private static var mUserHeaderName as Lang.String? = null;
|
||||
//! Additional user configurable HTTP header value
|
||||
private static var mUserHeaderValue as Lang.String = "";
|
||||
private static var mUserHeaderValue as Lang.String? = null;
|
||||
private static var mIsApp as Lang.Boolean = false;
|
||||
private static var mHasService as Lang.Boolean = false;
|
||||
//! Must keep the object so it doesn't get garbage collected.
|
||||
@@ -297,7 +297,8 @@ class Settings {
|
||||
//! @return The augmented HTTP header options.
|
||||
//
|
||||
static function augmentHttpHeaders(options as Lang.Dictionary) {
|
||||
if (mUserHeaderName != null && mUserHeaderName != "" && mUserHeaderValue != null && mUserHeaderValue != "") {
|
||||
// Use 'm.length() > 0' here in preference to 'm != ""' or '.equals("")'. They make the App crash on device but not in simulation.
|
||||
if (mUserHeaderName != null && mUserHeaderName.length() > 0 && mUserHeaderValue != null && mUserHeaderValue.length() > 0) {
|
||||
options[mUserHeaderName] = mUserHeaderValue;
|
||||
}
|
||||
return options;
|
||||
|
@@ -25,7 +25,9 @@ using Toybox.WatchUi;
|
||||
//!
|
||||
//! Reference: https://developers.home-assistant.io/docs/api/native-app-integration
|
||||
//
|
||||
(:glance)
|
||||
class WebhookManager {
|
||||
private var mSensors as Lang.Array<Lang.Object> = [];
|
||||
|
||||
//! Callback for requesting a Webhook ID.
|
||||
//!
|
||||
@@ -130,11 +132,7 @@ class WebhookManager {
|
||||
//! @param sensors The remaining sensors to be processed. The list of sensors is iterated through
|
||||
//! until empty. Each POST request creating one sensor on the local Home Assistant.
|
||||
//
|
||||
function onReturnRegisterWebhookSensor(
|
||||
responseCode as Lang.Number,
|
||||
data as Null or Lang.Dictionary or Lang.String,
|
||||
sensors as Lang.Array<Lang.Object>
|
||||
) as Void {
|
||||
function onReturnRegisterWebhookSensor(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
|
||||
switch (responseCode) {
|
||||
case Communications.BLE_HOST_TIMEOUT:
|
||||
case Communications.BLE_CONNECTION_UNAVAILABLE:
|
||||
@@ -179,10 +177,11 @@ class WebhookManager {
|
||||
var d = data as Lang.Dictionary;
|
||||
var b = d.get("success") as Lang.Boolean?;
|
||||
if (b != null and b != false) {
|
||||
if (sensors.size() == 0) {
|
||||
mSensors = mSensors.slice(1, null);
|
||||
if (mSensors.size() == 0) {
|
||||
getApp().startUpdates();
|
||||
} else {
|
||||
registerWebhookSensor(sensors);
|
||||
registerWebhookSensor();
|
||||
}
|
||||
} else {
|
||||
// System.println("WebhookManager onReturnRegisterWebhookSensor(): Failure, no 'success'.");
|
||||
@@ -213,11 +212,10 @@ class WebhookManager {
|
||||
}
|
||||
}
|
||||
|
||||
//! Local method to send the POST request to register a number of sensors.
|
||||
//!
|
||||
//! @param sensors An array of sensors, e.g. As created by `registerWebhookSensors()`.
|
||||
//! Local method to send the POST request to register a number of sensors. The sensors are taken from the class variable
|
||||
//! mSensors created by registerWebhookSensors().
|
||||
//
|
||||
private function registerWebhookSensor(sensors as Lang.Array<Lang.Object>) {
|
||||
private function registerWebhookSensor() {
|
||||
var url = Settings.getApiUrl() + "/webhook/" + Settings.getWebhookId();
|
||||
// System.println("WebhookManager registerWebhookSensor(): Registering webhook sensor: " + sensor.toString());
|
||||
// System.println("WebhookManager registerWebhookSensor(): URL=" + url);
|
||||
@@ -226,15 +224,14 @@ class WebhookManager {
|
||||
url,
|
||||
{
|
||||
"type" => "register_sensor",
|
||||
"data" => sensors[0]
|
||||
"data" => mSensors[0]
|
||||
},
|
||||
{
|
||||
:method => Communications.HTTP_REQUEST_METHOD_POST,
|
||||
:headers => Settings.augmentHttpHeaders({
|
||||
"Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
|
||||
}),
|
||||
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON,
|
||||
:context => sensors.slice(1, null)
|
||||
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
|
||||
},
|
||||
method(:onReturnRegisterWebhookSensor)
|
||||
);
|
||||
@@ -245,7 +242,7 @@ class WebhookManager {
|
||||
function registerWebhookSensors() {
|
||||
var heartRate = Activity.getActivityInfo().currentHeartRate;
|
||||
|
||||
var sensors = [
|
||||
mSensors = [
|
||||
{
|
||||
"device_class" => "battery",
|
||||
"name" => "Battery Level",
|
||||
@@ -283,7 +280,7 @@ class WebhookManager {
|
||||
if (Toybox has :ActivityMonitor) {
|
||||
// System.println("WebhookManager registerWebhookSensors(): has ActivityMonitor class");
|
||||
var activityInfo = ActivityMonitor.getInfo();
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Steps today",
|
||||
"state" => activityInfo.steps == null ? "unknown" : activityInfo.steps,
|
||||
"type" => "sensor",
|
||||
@@ -294,7 +291,7 @@ class WebhookManager {
|
||||
});
|
||||
|
||||
if (ActivityMonitor.Info has :floorsClimbed) {
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Floors climbed today",
|
||||
"state" => activityInfo.floorsClimbed == null ? "unknown" : activityInfo.floorsClimbed,
|
||||
"type" => "sensor",
|
||||
@@ -306,7 +303,7 @@ class WebhookManager {
|
||||
}
|
||||
|
||||
if (ActivityMonitor.Info has :floorsDescended) {
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Floors descended today",
|
||||
"state" => activityInfo.floorsDescended == null ? "unknown" : activityInfo.floorsDescended,
|
||||
"type" => "sensor",
|
||||
@@ -318,7 +315,7 @@ class WebhookManager {
|
||||
}
|
||||
|
||||
if (ActivityMonitor.Info has :respirationRate) {
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Respiration rate",
|
||||
"state" => activityInfo.respirationRate == null ? "unknown" : activityInfo.respirationRate,
|
||||
"type" => "sensor",
|
||||
@@ -345,14 +342,14 @@ class WebhookManager {
|
||||
activity = -1;
|
||||
sub_activity = -1;
|
||||
}
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Activity",
|
||||
"state" => activity,
|
||||
"type" => "sensor",
|
||||
"unique_id" => "activity",
|
||||
"disabled" => !Settings.isSensorsLevelEnabled()
|
||||
});
|
||||
sensors.add({
|
||||
mSensors.add({
|
||||
"name" => "Sub-activity",
|
||||
"state" => sub_activity,
|
||||
"type" => "sensor",
|
||||
@@ -361,7 +358,7 @@ class WebhookManager {
|
||||
});
|
||||
}
|
||||
|
||||
registerWebhookSensor(sensors);
|
||||
registerWebhookSensor();
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user