New glance and widget views

Added ability to test if we're a widget or a watch-app. Added troubleshooting documentation.
This commit is contained in:
Philip Abbey
2023-12-21 11:37:30 +00:00
parent 4e739e918e
commit 3934ca53ba
61 changed files with 1074 additions and 540 deletions

View File

@ -8,6 +8,8 @@ The application is designed around a simple scrollable menu where menu items hav
It is important to note that your Home Assistant instance will need to be accessible via HTTPS with public SSL or all requests from the Garmin will not work. This cannot be a self-signed certificate, it must be 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/)).
**If you are struggling with getting the application to work, please consult the [trouble shooting](Troubleshooting.md) guide first.**
## Widget or Application?
As of version 2.0, there are now two installable versions. For older devices before applications supported 'glances', there is a now widget version.
@ -168,8 +170,8 @@ This allows the `confirm` field to be accommodated in the `tap_action` along sid
You have options. The first is what we use.
1. **Best!** 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.
2. Locally installed VSCode, or if not installed
3. try the on-line version at https://vscode.dev/
2. Locally installed VSCode, or if not installed,
3. try the on-line version at https://vscode.dev/.
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.

107
Troubleshooting.md Normal file
View File

@ -0,0 +1,107 @@
# Troubleshooting Guide
With either of the following setups, there are inevitably some problems along the way. GarminHomeAssistant is careful to rely only on having working URLs. Getting them working is the user's responsibility. However, we have developed some fault finding tools.
## 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.
![Nabu Casa Setup](images/nabu_casa_setup.png)
* Your API URL would be of the format `https://<id>.ui.nabu.casa/api`
* Your Garmin Watch Menu would be of the format Menu: `https://<id>.ui.nabu.casa/local/garmin/menu.json`
Where `<id>` is your personal Nabu Casa account ID.
## Do It Yourself Setup
Before Nabu Casa, or if you wanted to manage your own infrastructure, you might have something like the following:
![Do It Yourself Setup](images/do_it_yourself_setup.png)
Now you have to manage:
* Dynamic DNS
* Public access via router port forwarding
* Security via HTTPS and URL forwarding
* Certificates for HTTPS via say [Let's Encrypt](https://letsencrypt.org/) (Nginx web server helps here)
* Proxy allow list in `configuration.yaml` as follows:
```yaml
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1
- 192.168.xx.xx # Server IP - AMEND THIS
- 172.30.32.0/23 # Docker IPs for NGINX
- 172.30.33.0/24 # SSL proxy server
- 172.16.0.0/12 #
```
## Menu Configuration URL
This URL is very simple, you should be able to read the contents returned in a standard web browser.
![Browser Address Bar URL](images/menu_url.png)
(Other browsers are available...)
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.
## Home Assistant 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:
```json
{"message":"API running."}
```
### Linux, MacOS, UNIX, Cygwin etc
Save the following as a file called `api_test.sh`, edit to include your personal values for the variables, `chmod +x api_test.sh` and then execute with `./api_test.sh`.
```shell
#!/bin/bash
API_KEY="<Your API key>"
URL="https://<Your Domain>/api"
curl -s -X GET \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" \
${URL}/
```
### MS Windows
Save the following as a file called `api_test.cmd`, edit to include your personal values for the variables and then double click.
```shell
@echo off
set API_KEY=<Your API key>
set URL=https://<Your Domain>/api
curl -s -X GET ^
-H "Authorization: Bearer %API_KEY%" ^
-H "Content-Type: application/json" ^
%URL%/
echo.
pause
```
![API Test MS-DOS Output](images/api_test_dos_output.png)
### On-line
There's an online way of testing the API URL too, thanks to [REQBIN](https://reqbin.com/post-online). This has less setup and it can be saved if you log into the web site.
![API Test MS-DOS Output](images/api_test_online.png)
## Top Problems
1. Failure to copy & paste keys and URLs leading to minor and hard to see errors in strings, even with protestations they are the same! (No they weren't...)
2. Accessibility of URLs, hence the above help guide.

View File

@ -23,6 +23,8 @@ set JAVA_PATH=C:\Program Files (x86)\Common Files\Oracle\Java\javapath
rem SDK_PATH should work for all users
set /p SDK_PATH=<"%USERPROFILE%\AppData\Roaming\Garmin\ConnectIQ\current-sdk.cfg"
set SDK_PATH=%SDK_PATH:~0,-1%\bin
rem Assume we can create and use this directory
set DEST=export
rem C:\>java -jar %SDK_PATH%\monkeybrains.jar -h
rem usage: monkeyc [-a <arg>] [-b <arg>] [--build-stats <arg>] [-c <arg>] [-d <arg>]
@ -69,6 +71,10 @@ set SRC=%~dp0
rem drop last character '\'
set SRC=%SRC:~0,-1%
if not exist %DEST% (
md %DEST%
)
if exist %SRC%\export\HomeAssistant*.iq (
del /f /q %SRC%\export\HomeAssistant*.iq
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
images/api_test_online.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 KiB

BIN
images/menu_url.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
images/nabu_casa_setup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

Binary file not shown.

28
include/app/WidgetApp.mc Normal file
View File

@ -0,0 +1,28 @@
//-----------------------------------------------------------------------------------
//
// 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.
//
// P A Abbey & J D Abbey & Someone0nEarth, 20 December 2023
//
//
// Description:
//
// A tedious diversion intended to make it possible to have the same source code for
// both a widget and an application. This file provides a single constant to
// determine which, and then the source file is conditionally included by the each
// .jungle file.
//
//-----------------------------------------------------------------------------------
using Toybox.Lang;
class WidgetApp {
static const isWidget = false;
}

View File

@ -0,0 +1,28 @@
//-----------------------------------------------------------------------------------
//
// 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.
//
// P A Abbey & J D Abbey & Someone0nEarth, 20 December 2023
//
//
// Description:
//
// A tedious diversion intended to make it possible to have the same source code for
// both a widget and an application. This file provides a single constant to
// determine which, and then the source file is conditionally included by the each
// .jungle file.
//
//-----------------------------------------------------------------------------------
using Toybox.Lang;
class WidgetApp {
static const isWidget = true;
}

View File

@ -24,7 +24,14 @@
Use "Monkey C: Edit Application" from the Visual Studio Code command palette
to update the application attributes.
-->
<!--
Testing in VSCode requires monkey.jungle, so for convenience, swap between
watch-app and widget by changing which of the next two lines are commented out
-->
<iq:application id="98c36259-498a-4458-9cef-74a273ad2bc3" type="watch-app" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
<!--
<iq:application id="4901cdfb-b4a2-4f33-96c7-f5be5992809e" type="widget" name="@Strings.AppName" entry="HomeAssistantApp" launcherIcon="@Drawables.LauncherIcon" minApiLevel="3.1.0">
-->
<!--
Use the following from the Visual Studio Code comand palette to edit
the build targets:

View File

@ -18,6 +18,8 @@
project.manifest = manifest-widget.xml
base.sourcePath = source;include/widget
# Device References
# * https://developer.garmin.com/connect-iq/compatible-devices/
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/

View File

@ -18,6 +18,11 @@
project.manifest = manifest.xml
# Testing in VSCode requires monkey.jungle, so for convenience, swap between
# watch-app and widget by changing which of the next two lines are commented out
base.sourcePath = source;include/app
#base.sourcePath = source;include/widget
# Device References
# * https://developer.garmin.com/connect-iq/compatible-devices/
# * https://developer.garmin.com/connect-iq/reference-guides/devices-reference/

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">مقبض</string>
<string id="MenuItemMenu">قائمة طعام</string>
<string id="Confirm">بالتأكيد؟</string>
<string id="NoPhone">لا يوجد اتصال الهاتف</string>
<string id="NoPhone" scope="glance">لا يوجد اتصال الهاتف</string>
<string id="NoInternet">لا يوجد اتصال بالإنترنت</string>
<string id="NoResponse">لا توجد استجابة، تحقق من الاتصال بالإنترنت</string>
<string id="NoMenu">خطأ في إحضار القائمة</string>
<string id="NoAPIKey">لا يوجد مفتاح API في إعدادات التطبيق</string>
<string id="NoApiUrl">لا يوجد عنوان URL لواجهة برمجة التطبيقات في إعدادات التطبيق</string>
<string id="NoConfigUrl">لا يوجد عنوان URL للتكوين في إعدادات التطبيق</string>
<string id="NoAPIKey" scope="glance">لا يوجد مفتاح API في إعدادات التطبيق</string>
<string id="NoApiUrl" scope="glance">لا يوجد عنوان URL لواجهة برمجة التطبيقات في إعدادات التطبيق</string>
<string id="NoConfigUrl" scope="glance">لا يوجد عنوان URL للتكوين في إعدادات التطبيق</string>
<string id="ApiFlood">مكالمات API سريعة جدًا. يرجى إبطاء طلباتك.</string>
<string id="ApiUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL لواجهة برمجة التطبيقات في الإعدادات.</string>
<string id="ConfigUrlNotFound">لم يتم العثور على عنوان URL. خطأ محتمل في عنوان URL للتكوين في الإعدادات.</string>
<string id="NoJson">لم يتم إرجاع JSON من طلب HTTP.</string>
<string id="UnhandledHttpErr">قام طلب HTTP بإرجاع رمز الخطأ =</string>
<string id="TrailingSlashErr">يجب ألا يحتوي عنوان URL لواجهة برمجة التطبيقات على شرطة مائلة لاحقة '/'</string>
<string id="FetchingMenuConfig">جارٍ جلب تكوين القائمة..</string>
<string id="ExitViewTouch">مرّر سريعًا إلى اليمين للخروج\nانقر للبقاء</string>
<string id="ExitViewButtons">اضغط على "الرجوع للخروج"\nأدخل للبقاء</string>
<string id="Available" scope="glance">متاح</string>
<string id="Checking" scope="glance">تدقيق...</string>
<string id="Unavailable" scope="glance">غير متوفره</string>
<string id="GlanceMenu" scope="glance">قائمة طعام</string>
<!-- لإعدادات واجهة المستخدم الرسومية -->
<string id="SettingsApiKey">مفتاح API لـ HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">رمز الوصول طويل الأمد.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Докоснете</string>
<string id="MenuItemMenu">Меню</string>
<string id="Confirm">Сигурен?</string>
<string id="NoPhone">Няма телефонна връзка</string>
<string id="NoPhone" scope="glance">Няма телефонна връзка</string>
<string id="NoInternet">Няма интернет връзка</string>
<string id="NoResponse">Няма отговор, проверете интернет връзката</string>
<string id="NoMenu">Грешка при извличане на менюто</string>
<string id="NoAPIKey">Няма API ключ в настройките на приложението</string>
<string id="NoApiUrl">Няма URL адрес на API в настройките на приложението</string>
<string id="NoConfigUrl">Няма конфигурационен URL адрес в настройките на приложението</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="ApiFlood">Извикванията на API са твърде бързи. Моля, забавете вашите заявки.</string>
<string id="ApiUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на API в настройките.</string>
<string id="ConfigUrlNotFound">URL не е намерен. Потенциална грешка в URL адреса на конфигурацията в настройките.</string>
<string id="NoJson">Няма върнат JSON от HTTP заявка.</string>
<string id="UnhandledHttpErr">HTTP заявката върна код на грешка =</string>
<string id="TrailingSlashErr">URL адресът на API не трябва да има наклонена черта '/' в края</string>
<string id="FetchingMenuConfig">Извличане на конфигурацията на менюто..</string>
<string id="ExitViewTouch">Плъзнете надясно, за да излезете\nДокоснете, за да останете</string>
<string id="ExitViewButtons">Натиснете Назад, за да излезете\nВлезте, за да останете</string>
<string id="Available" scope="glance">На разположение</string>
<string id="Checking" scope="glance">Проверка...</string>
<string id="Unavailable" scope="glance">Недостъпен</string>
<string id="GlanceMenu" scope="glance">Меню</string>
<!-- За GUI за настройки -->
<string id="SettingsApiKey">API ключ за HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Токен за дълготраен достъп.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Klepněte</string>
<string id="MenuItemMenu">Jídelní lístek</string>
<string id="Confirm">Tak určitě?</string>
<string id="NoPhone">Žádné telefonní spojení</string>
<string id="NoPhone" scope="glance">Žádné telefonní spojení</string>
<string id="NoInternet">Žádné internetové připojení</string>
<string id="NoResponse">Žádná odpověď, zkontrolujte připojení k internetu</string>
<string id="NoMenu">Chyba načítání nabídky</string>
<string id="NoAPIKey">V nastavení aplikace není žádný klíč API</string>
<string id="NoApiUrl">V nastavení aplikace není žádná adresa URL API</string>
<string id="NoConfigUrl">V nastavení aplikace není žádná konfigurační URL</string>
<string id="NoAPIKey" scope="glance">V nastavení aplikace není žádný klíč API</string>
<string id="NoApiUrl" scope="glance">V nastavení aplikace není žádná adresa URL API</string>
<string id="NoConfigUrl" scope="glance">V nastavení aplikace není žádná konfigurační URL</string>
<string id="ApiFlood">Příliš rychlá volání API. Zpomalte prosím své požadavky.</string>
<string id="ApiUrlNotFound">Adresa URL nenalezena. Potenciální chyba adresy URL rozhraní API v nastavení.</string>
<string id="ConfigUrlNotFound">Adresa URL nenalezena. Potenciální chyba konfigurační adresy URL v nastavení.</string>
<string id="NoJson">Z požadavku HTTP se nevrátil žádný JSON.</string>
<string id="UnhandledHttpErr">Požadavek HTTP vrátil kód chyby =</string>
<string id="TrailingSlashErr">Adresa URL rozhraní API nesmí mít koncové lomítko „/“</string>
<string id="FetchingMenuConfig">Načítání konfigurace nabídky...</string>
<string id="ExitViewTouch">Přejetím prstem doprava ukončíte\nKlepnutím zůstanete</string>
<string id="ExitViewButtons">Stisknutím Zpět ukončíte\nVstupte a zůstanete</string>
<string id="Available" scope="glance">Dostupný</string>
<string id="Checking" scope="glance">Kontrola...</string>
<string id="Unavailable" scope="glance">Není k dispozici</string>
<string id="GlanceMenu" scope="glance">Jídelní lístek</string>
<!-- Pro nastavení GUI -->
<string id="SettingsApiKey">Klíč API pro HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Přístupový token s dlouhou životností.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Tryk på</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Jo da?</string>
<string id="NoPhone">Ingen telefonforbindelse</string>
<string id="NoPhone" scope="glance">Ingen telefonforbindelse</string>
<string id="NoInternet">Ingen internetforbindelse</string>
<string id="NoResponse">Intet svar, tjek internetforbindelse</string>
<string id="NoMenu">Fejl ved menuhentning</string>
<string id="NoAPIKey">Ingen API-nøgle i applikationsindstillingerne</string>
<string id="NoApiUrl">Ingen API-URL i applikationsindstillingerne</string>
<string id="NoConfigUrl">Ingen konfigurations-URL i applikationsindstillingerne</string>
<string id="NoAPIKey" scope="glance">Ingen API-nøgle i applikationsindstillingerne</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsindstillingerne</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i applikationsindstillingerne</string>
<string id="ApiFlood">API-kald for hurtigt. Sænk venligst dine anmodninger.</string>
<string id="ApiUrlNotFound">URL ikke fundet. Potentiel API URL-fejl i indstillinger.</string>
<string id="ConfigUrlNotFound">URL ikke fundet. Potentiel konfigurations-URL-fejl i indstillinger.</string>
<string id="NoJson">Ingen JSON returneret fra HTTP-anmodning.</string>
<string id="UnhandledHttpErr">HTTP-anmodning returnerede fejlkode =</string>
<string id="TrailingSlashErr">API URL må ikke have en efterfølgende skråstreg '/'</string>
<string id="FetchingMenuConfig">Henter menukonfiguration..</string>
<string id="ExitViewTouch">Stryg til højre for at afslutte\nTryk for at blive</string>
<string id="ExitViewButtons">Tryk tilbage for at afslutte\nEnter for at blive</string>
<string id="Available" scope="glance">Ledig</string>
<string id="Checking" scope="glance">Tjekker...</string>
<string id="Unavailable" scope="glance">Ikke tilgængelig</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Til indstillingerne GUI -->
<string id="SettingsApiKey">API-nøgle til HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Adgangstoken med lang levetid.</string>

View File

@ -22,7 +22,4 @@
<string id="MenuItemTap">Antippen</string>
<string id="MenuItemMenu">Menü</string>
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
<string id="ExitViewTouch">Zum Beenden nach rechts swipen\nZum Bleiben antippen</string>
<string id="ExitViewButtons">Drücke „Zurück“, um zu Beenden.\n„Enter“, um zu bleiben</string>
<string id="FetchingMenuConfig">Lade Config vom Server ... </string>
</strings>

View File

@ -23,23 +23,24 @@
<string id="MenuItemOn">An</string>
<string id="MenuItemOff">Aus</string>
<string id="MenuItemTap">Antippen</string>
<string id="MenuItemMenu">Menü</string>
<string id="MenuItemMenu">Menü</string>
<string id="Confirm">Sicher?</string>
<string id="NoPhone">Keine Telefonverbindung</string>
<string id="NoPhone" scope="glance">Keine Telefonverbindung</string>
<string id="NoInternet">Keine Internetverbindung</string>
<string id="NoResponse">Keine Antwort, überprüfen Sie die Internetverbindung</string>
<string id="NoMenu">Fehler beim Abrufen des Menüs</string>
<string id="NoAPIKey">Kein API-Schlüssel in den Anwendungseinstellungen</string>
<string id="NoApiUrl">Keine API-URL in den Anwendungseinstellungen</string>
<string id="NoConfigUrl">Keine Konfigurations-URL in den Anwendungseinstellungen</string>
<string id="NoAPIKey" scope="glance">Kein API-Schlüssel in den Anwendungseinstellungen</string>
<string id="NoApiUrl" scope="glance">Keine API-URL in den Anwendungseinstellungen</string>
<string id="NoConfigUrl" scope="glance">Keine Konfigurations-URL in den Anwendungseinstellungen</string>
<string id="ApiFlood">API-Aufrufe zu schnell. Bitte verlangsamen Sie Ihre Anfragen.</string>
<string id="ApiUrlNotFound">URL nicht gefunden. Möglicher API-URL-Fehler in den Einstellungen.</string>
<string id="ConfigUrlNotFound">URL nicht gefunden. Möglicher Konfigurations-URL-Fehler in den Einstellungen.</string>
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
<string id="NoJson">Von der HTTP-Anfrage wurde kein JSON zurückgegeben.</string>
<string id="UnhandledHttpErr">Die HTTP-Anfrage gab folgenden Fehlercode zurück = </string>
<string id="TrailingSlashErr">Die API-URL darf keinen abschließenden Schrägstrich „/“ enthalten.</string>
<string id="FetchingMenuConfig">Lade Config vom Server ... </string>
<string id="ExitViewTouch">Zum Beenden nach rechts swipen\nZum Bleiben antippen</string>
<string id="ExitViewButtons">Drücke „Zurück“, um zu Beenden.\n„Enter“, um zu bleiben</string>
<string id="Available" scope="glance">Verfügbar</string>
<string id="Checking" scope="glance">Überprüfung...</string>
<string id="Unavailable" scope="glance">Nicht verfügbar</string>
<string id="GlanceMenu" scope="glance">Speisekarte</string>
<!-- Für die Einstellungs-GUI -->
<string id="SettingsApiKey">API-Schlüssel für HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Langlebiges Zugriffstoken.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Kraan</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Zeker?</string>
<string id="NoPhone">Geen telefoonverbinding</string>
<string id="NoPhone" scope="glance">Geen telefoonverbinding</string>
<string id="NoInternet">Geen internet verbinding</string>
<string id="NoResponse">Geen reactie, controleer de internetverbinding</string>
<string id="NoMenu">Fout bij ophalen van menu</string>
<string id="NoAPIKey">Geen API-sleutel in de applicatie-instellingen</string>
<string id="NoApiUrl">Geen API-URL in de applicatie-instellingen</string>
<string id="NoConfigUrl">Geen configuratie-URL in de applicatie-instellingen</string>
<string id="NoAPIKey" scope="glance">Geen API-sleutel in de applicatie-instellingen</string>
<string id="NoApiUrl" scope="glance">Geen API-URL in de applicatie-instellingen</string>
<string id="NoConfigUrl" scope="glance">Geen configuratie-URL in de applicatie-instellingen</string>
<string id="ApiFlood">API-aanroepen te snel. Vertraag uw verzoeken.</string>
<string id="ApiUrlNotFound">URL niet gevonden. Mogelijke API-URL-fout in instellingen.</string>
<string id="ConfigUrlNotFound">URL niet gevonden. Mogelijke configuratie-URL-fout in de instellingen.</string>
<string id="NoJson">Er is geen JSON geretourneerd door een HTTP-verzoek.</string>
<string id="UnhandledHttpErr">HTTP-verzoek retourneerde foutcode =</string>
<string id="TrailingSlashErr">API-URL mag geen afsluitende slash '/' bevatten</string>
<string id="FetchingMenuConfig">Menuconfiguratie ophalen..</string>
<string id="ExitViewTouch">Veeg naar rechts om af te sluiten\nTik om te blijven</string>
<string id="ExitViewButtons">Druk op Terug om af te sluiten\nEnter om te blijven</string>
<string id="Available" scope="glance">Beschikbaar</string>
<string id="Checking" scope="glance">Controleren...</string>
<string id="Unavailable" scope="glance">Niet beschikbaar</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Voor de instellingen-GUI -->
<string id="SettingsApiKey">API-sleutel voor HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Toegangstoken met lange levensduur.</string>

View File

@ -15,7 +15,7 @@
<!--
Generated by Google Translate: English to Estonian
Inglise keelest loodud Google'i tõlke abil
Loodud Google'i tõlke abil inglise keelest
-->
<strings>
@ -25,21 +25,22 @@
<string id="MenuItemTap">Puudutage</string>
<string id="MenuItemMenu">Menüü</string>
<string id="Confirm">Muidugi?</string>
<string id="NoPhone">Telefoniühendus puudub</string>
<string id="NoPhone" scope="glance">Telefoniühendus puudub</string>
<string id="NoInternet">Interneti-ühendus puudub</string>
<string id="NoResponse">Ei reageeri, kontrollige Interneti-ühendust</string>
<string id="NoMenu">Menüü toomise viga</string>
<string id="NoAPIKey">Rakenduse seadetes pole API-võtit</string>
<string id="NoApiUrl">Rakenduse seadetes pole API URL-i</string>
<string id="NoConfigUrl">Rakenduse seadetes pole konfiguratsiooni URL-i</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="ApiFlood">API-kutsed liiga kiired. Palun aeglustage taotluste esitamist.</string>
<string id="ApiUrlNotFound">URL-i ei leitud. Võimalik API URL-i viga seadetes.</string>
<string id="ConfigUrlNotFound">URL-i ei leitud. Võimalik konfiguratsiooni URL-i viga seadetes.</string>
<string id="NoJson">HTTP-päringust ei tagastatud ühtegi JSON-i.</string>
<string id="UnhandledHttpErr">HTTP päring tagastas veakoodi =</string>
<string id="TrailingSlashErr">API URL-i lõpus ei tohi olla kaldkriipsu „/”</string>
<string id="FetchingMenuConfig">Menüü konfiguratsiooni toomine...</string>
<string id="ExitViewTouch">Väljumiseks pühkige paremale\nPuudutage, et jääda</string>
<string id="ExitViewButtons">Väljumiseks vajutage Tagasi\nSisestage, et jääda</string>
<string id="Available" scope="glance">Saadaval</string>
<string id="Checking" scope="glance">Kontrollimine...</string>
<string id="Unavailable" scope="glance">Pole saadaval</string>
<string id="GlanceMenu" scope="glance">Menüü</string>
<!-- Seadete GUI jaoks -->
<string id="SettingsApiKey">API-võti HomeAssistantile.</string>
<string id="SettingsApiKeyPrompt">Pikaealine juurdepääsuluba.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Napauta</string>
<string id="MenuItemMenu">Valikko</string>
<string id="Confirm">Varma?</string>
<string id="NoPhone">Ei puhelinyhteyttä</string>
<string id="NoPhone" scope="glance">Ei puhelinyhteyttä</string>
<string id="NoInternet">Ei Internet-yhteyttä</string>
<string id="NoResponse">Ei vastausta, tarkista Internet-yhteys</string>
<string id="NoMenu">Valikkohakuvirhe</string>
<string id="NoAPIKey">Sovelluksen asetuksissa ei ole API-avainta</string>
<string id="NoApiUrl">Sovellusasetuksissa ei ole API URL-osoitetta</string>
<string id="NoConfigUrl">Sovelluksen asetuksissa ei ole konfigurointi-URL-osoitetta</string>
<string id="NoAPIKey" scope="glance">Sovellusasetuksissa ei ole API-avainta</string>
<string id="NoApiUrl" scope="glance">Sovellusasetuksissa ei ole API URL-osoitetta</string>
<string id="NoConfigUrl" scope="glance">Sovelluksen asetuksissa ei ole konfigurointi-URL-osoitetta</string>
<string id="ApiFlood">API-kutsut liian nopeita. Hidasta pyyntöjäsi.</string>
<string id="ApiUrlNotFound">URL-osoitetta ei löydy. Mahdollinen API URL -virhe asetuksissa.</string>
<string id="ConfigUrlNotFound">URL-osoitetta ei löydy. Mahdollinen konfigurointi-URL-virhe asetuksissa.</string>
<string id="NoJson">HTTP-pyynnöstä ei palautettu JSON-tiedostoja.</string>
<string id="UnhandledHttpErr">HTTP-pyyntö palautti virhekoodin =</string>
<string id="TrailingSlashErr">API-URL-osoitteessa ei saa olla perässä olevaa kauttaviivaa '/'</string>
<string id="FetchingMenuConfig">Haetaan valikon asetuksia...</string>
<string id="ExitViewTouch">Poistu pyyhkäisemällä oikealle\nPysy napauttamalla</string>
<string id="ExitViewButtons">Poistu painamalla Takaisin\nSyötä jäädäksesi</string>
<string id="Available" scope="glance">Saatavilla</string>
<string id="Checking" scope="glance">Tarkistetaan...</string>
<string id="Unavailable" scope="glance">Ei saatavilla</string>
<string id="GlanceMenu" scope="glance">Valikko</string>
<!-- GUI-asetusten osalta -->
<string id="SettingsApiKey">API-avain HomeAssistantille.</string>
<string id="SettingsApiKeyPrompt">Pitkäikäinen pääsytunnus.</string>

View File

@ -20,26 +20,27 @@
<strings>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="MenuItemOn">Activé</string>
<string id="MenuItemOn">Activé</string>
<string id="MenuItemOff">Désactivé</string>
<string id="MenuItemTap">Clic</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Bien sûr?</string>
<string id="NoPhone">Pas de connexion téléphonique</string>
<string id="NoPhone" scope="glance">Pas de connexion téléphonique</string>
<string id="NoInternet">Pas de connexion Internet</string>
<string id="NoResponse">Pas de réponse, vérifiez la connexion Internet</string>
<string id="NoMenu">Erreur de récupération du menu</string>
<string id="NoAPIKey">Pas de clé API dans les paramètres de l'application</string>
<string id="NoApiUrl">Aucune URL API dans les paramètres de l'application</string>
<string id="NoConfigUrl">Aucune URL de configuration dans les paramètres de l'application</string>
<string id="ApiFlood">Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil.</string>
<string id="NoAPIKey" scope="glance">Pas de clé API dans les paramètres de l'application</string>
<string id="NoApiUrl" scope="glance">Aucune URL 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="ApiFlood">Appels API trop rapide. Veuillez signaler cette erreur avec les détails de l'appareil.</string>
<string id="ApiUrlNotFound">URL introuvable. Erreur potentielle d'URL d'API dans les paramètres.</string>
<string id="ConfigUrlNotFound">URL introuvable. Erreur potentielle d'URL de configuration dans les paramètres.</string>
<string id="NoJson">Aucun JSON renvoyé par la requête HTTP.</string>
<string id="UnhandledHttpErr">La requête HTTP a renvoyé un code d'erreur =</string>
<string id="TrailingSlashErr">L'URL de l'API ne doit pas comporter de barre oblique finale '/'</string>
<string id="FetchingMenuConfig">Récupération de la configuration du menu.</string>
<string id="ExitViewTouch">Balayez vers la droite pour quitter\nAppuyez pour rester</string>
<string id="ExitViewButtons">Appuyez sur Retour pour quitter\nEntrez pour rester</string>
<string id="Available" scope="glance">Disponible</string>
<string id="Checking" scope="glance">Vérification...</string>
<string id="Unavailable" scope="glance">Indisponible</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Pour l'interface graphique des paramètres -->
<string id="SettingsApiKey">Clé API pour HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Jeton d'accès de longue durée.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Παρακέντηση</string>
<string id="MenuItemMenu">Μενού</string>
<string id="Confirm">Σίγουρος?</string>
<string id="NoPhone">Δεν υπάρχει σύνδεση τηλεφώνου</string>
<string id="NoPhone" scope="glance">Δεν υπάρχει σύνδεση τηλεφώνου</string>
<string id="NoInternet">Δεν υπάρχει σύνδεση στο διαδίκτυο</string>
<string id="NoResponse">Καμία απάντηση, ελέγξτε τη σύνδεση στο Διαδίκτυο</string>
<string id="NoMenu">Σφάλμα ανάκτησης μενού</string>
<string id="NoAPIKey">Δεν υπάρχει κλειδί API στις ρυθμίσεις της εφαρμογής</string>
<string id="NoApiUrl">Δεν υπάρχει διεύθυνση URL API στις ρυθμίσεις της εφαρμογής</string>
<string id="NoConfigUrl">Δεν υπάρχει διεύθυνση URL διαμόρφωσης στις ρυθμίσεις της εφαρμογής</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="ApiFlood">Κλήσεις API πολύ γρήγορες. Παρακαλώ επιβραδύνετε τα αιτήματά σας.</string>
<string id="ApiUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL API στις ρυθμίσεις.</string>
<string id="ConfigUrlNotFound">Η διεύθυνση URL δεν βρέθηκε. Πιθανό σφάλμα διεύθυνσης URL διαμόρφωσης στις ρυθμίσεις.</string>
<string id="NoJson">Δεν επιστράφηκε JSON από αίτημα HTTP.</string>
<string id="UnhandledHttpErr">Το αίτημα HTTP επέστρεψε κωδικό σφάλματος =</string>
<string id="TrailingSlashErr">Η διεύθυνση URL του API δεν πρέπει να έχει τελική κάθετο "/"</string>
<string id="FetchingMenuConfig">Ανάκτηση παραμέτρων μενού..</string>
<string id="ExitViewTouch">Σύρετε προς τα δεξιά για έξοδο\nΠατήστε για να μείνετε</string>
<string id="ExitViewButtons">Πατήστε Επιστροφή για Έξοδος\nEnter για να μείνετε</string>
<string id="Available" scope="glance">Διαθέσιμος</string>
<string id="Checking" scope="glance">Ελεγχος...</string>
<string id="Unavailable" scope="glance">Μη διαθέσιμο</string>
<string id="GlanceMenu" scope="glance">Μενού</string>
<!-- Για τις ρυθμίσεις GUI -->
<string id="SettingsApiKey">Κλειδί API για το HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Διακριτικό πρόσβασης μακράς διαρκείας.</string>

View File

@ -25,28 +25,29 @@
<string id="MenuItemTap">בֶּרֶז</string>
<string id="MenuItemMenu">תַפרִיט</string>
<string id="Confirm">בטוח?</string>
<string id="NoPhone">אין חיבור לטלפון</string>
<string id="NoPhone" scope="glance">אין חיבור לטלפון</string>
<string id="NoInternet">אין חיבור אינטרנט</string>
<string id="NoResponse">אין תגובה, בדוק חיבור לאינטרנט</string>
<string id="NoMenu">שגיאת אחזור תפריט</string>
<string id="NoAPIKey">אין מפתח API בהגדרות האפליקציה</string>
<string id="NoApiUrl">אין כתובת API בהגדרות האפליקציה</string>
<string id="NoConfigUrl">אין כתובת אתר תצורה בהגדרות האפליקציה</string>
<string id="NoAPIKey" scope="glance">אין מפתח API בהגדרות האפליקציה</string>
<string id="NoApiUrl" scope="glance">אין כתובת API בהגדרות האפליקציה</string>
<string id="NoConfigUrl" scope="glance">אין כתובת אתר תצורה בהגדרות האפליקציה</string>
<string id="ApiFlood">קריאות API מהירות מדי. נא להאט את הבקשות שלך.</string>
<string id="ApiUrlNotFound">כתובת האתר לא נמצאה. שגיאה פוטנציאלית של כתובת ה-API בהגדרות.</string>
<string id="ConfigUrlNotFound">כתובת האתר לא נמצאה. שגיאת כתובת אתר פוטנציאלית של תצורה בהגדרות.</string>
<string id="NoJson">לא הוחזר JSON מבקשת HTTP.</string>
<string id="UnhandledHttpErr">בקשת HTTP החזירה קוד שגיאה =</string>
<string id="TrailingSlashErr">כתובת ה-API לא חייבת לכלול לוכסן אחורי '/'</string>
<string id="FetchingMenuConfig">מביא את תצורת התפריט...</string>
<string id="ExitViewTouch">החלק ימינה כדי לצאת\nהקש כדי להישאר</string>
<string id="ExitViewButtons">לחץ על חזרה ליציאה\nEnter כדי להישאר</string>
<string id="Available" scope="glance">זמין</string>
<string id="Checking" scope="glance">בודק...</string>
<string id="Unavailable" scope="glance">אינו זמין</string>
<string id="GlanceMenu" scope="glance">תַפרִיט</string>
<!-- עבור ה-GUI של ההגדרות -->
<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="SettingsConfigUrl">כתובת URL לתצורת תפריט (JSON).</string>
<string id="SettingsAppTimeout">פסק זמן בשניות. צא מהאפליקציה לאחר תקופה זו של חוסר פעילות כדי לחסוך בסוללת המכשיר.</string>
<string id="SettingsConfirmTimeout">לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי להשבית את הזמן הקצוב.</string>
<string id="SettingsConfirmTimeout">לאחר זמן זה (בשניות), תיבת דו-שיח לאישור פעולה נסגרת אוטומטית והפעולה מבוטלת. הגדר ל-0 כדי לבטל את הזמן הקצוב.</string>
<string id="SettingsUi">ייצוג סוגים עם סמלים (כבוי) או עם תוויות (מופעל).</string>
<string id="SettingsTextAlign">יישור תפריט שמאלה (כבוי) או ימינה (מופעל).</string>
</strings>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Dodirnite</string>
<string id="MenuItemMenu">Jelovnik</string>
<string id="Confirm">Naravno?</string>
<string id="NoPhone">Nema telefonske veze</string>
<string id="NoPhone" scope="glance">Nema telefonske veze</string>
<string id="NoInternet">Nema internetske veze</string>
<string id="NoResponse">Nema odgovora, provjerite internetsku vezu</string>
<string id="NoMenu">Pogreška dohvaćanja izbornika</string>
<string id="NoAPIKey">Nema API ključa u postavkama aplikacije</string>
<string id="NoApiUrl">Nema API URL-a u postavkama aplikacije</string>
<string id="NoConfigUrl">Nema konfiguracijskog URL-a u postavkama aplikacije</string>
<string id="NoAPIKey" scope="glance">Nema API ključa u postavkama aplikacije</string>
<string id="NoApiUrl" scope="glance">Nema API URL-a u postavkama aplikacije</string>
<string id="NoConfigUrl" scope="glance">Nema konfiguracijskog URL-a u postavkama aplikacije</string>
<string id="ApiFlood">API pozivi su prebrzi. Molimo usporite svoje zahtjeve.</string>
<string id="ApiUrlNotFound">URL nije pronađen. Potencijalna pogreška API URL-a u postavkama.</string>
<string id="ConfigUrlNotFound">URL nije pronađen. Potencijalna pogreška URL-a konfiguracije u postavkama.</string>
<string id="NoJson">HTTP zahtjev nije vratio JSON.</string>
<string id="UnhandledHttpErr">HTTP zahtjev vratio je kod greške =</string>
<string id="TrailingSlashErr">API URL ne smije imati kosu crtu na kraju '/'</string>
<string id="FetchingMenuConfig">Dohvaćanje konfiguracije izbornika..</string>
<string id="ExitViewTouch">Prijeđite prstom udesno za izlaz\nDodirnite za ostanak</string>
<string id="ExitViewButtons">Pritisnite Natrag za izlaz\nUnesite za ostanak</string>
<string id="Available" scope="glance">Dostupno</string>
<string id="Checking" scope="glance">Provjera...</string>
<string id="Unavailable" scope="glance">Nedostupan</string>
<string id="GlanceMenu" scope="glance">Jelovnik</string>
<!-- Za GUI postavki -->
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Dugotrajni pristupni token.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Koppintson a</string>
<string id="MenuItemMenu">Menü</string>
<string id="Confirm">Biztos?</string>
<string id="NoPhone">Nincs telefonkapcsolat</string>
<string id="NoPhone" scope="glance">Nincs telefonkapcsolat</string>
<string id="NoInternet">Nincs internetkapcsolat</string>
<string id="NoResponse">Nincs válasz, ellenőrizze az internetkapcsolatot</string>
<string id="NoMenu">Menü Lekérési hiba</string>
<string id="NoAPIKey">Nincs API kulcs az alkalmazás beállításaiban</string>
<string id="NoApiUrl">Nincs API URL az alkalmazás beállításai között</string>
<string id="NoConfigUrl">Nincs konfigurációs URL az alkalmazás beállításai között</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ásai között</string>
<string id="NoConfigUrl" scope="glance">Nincs konfigurációs URL az alkalmazás beállításai között</string>
<string id="ApiFlood">Az API-hívások túl gyorsak. Kérjük, lassítsa a kérések teljesítését.</string>
<string id="ApiUrlNotFound">Az URL nem található. Lehetséges API URL hiba a beállításokban.</string>
<string id="ConfigUrlNotFound">Az URL nem található. Lehetséges konfigurációs URL hiba a beállításokban.</string>
<string id="NoJson">A HTTP-kérésből nem érkezett vissza JSON.</string>
<string id="UnhandledHttpErr">A HTTP-kérés = hibakódot adott vissza</string>
<string id="TrailingSlashErr">Az API URL-ben nem lehet perjel a „/”</string>
<string id="FetchingMenuConfig">Menükonfiguráció lekérése...</string>
<string id="ExitViewTouch">Csúsztassa jobbra a kilépéshez.\nKoppintson a Maradáshoz</string>
<string id="ExitViewButtons">Nyomja meg a Vissza gombot a kilépéshez\nEnter a Maradáshoz</string>
<string id="Available" scope="glance">Elérhető</string>
<string id="Checking" scope="glance">Ellenőrzés...</string>
<string id="Unavailable" scope="glance">Nem érhető el</string>
<string id="GlanceMenu" scope="glance">Menü</string>
<!-- A beállítások GUI-hoz -->
<string id="SettingsApiKey">API-kulcs a HomeAssistant számára.</string>
<string id="SettingsApiKeyPrompt">Hosszú életű hozzáférési token.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Mengetuk</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Tentu?</string>
<string id="NoPhone">Tidak ada koneksi Telepon</string>
<string id="NoPhone" scope="glance">Tidak ada koneksi Telepon</string>
<string id="NoInternet">Tidak ada koneksi internet</string>
<string id="NoResponse">Tidak Ada Respon, periksa koneksi Internet</string>
<string id="NoMenu">Kesalahan Pengambilan Menu</string>
<string id="NoAPIKey">Tidak ada kunci API di pengaturan aplikasi</string>
<string id="NoApiUrl">Tidak ada URL API di pengaturan aplikasi</string>
<string id="NoConfigUrl">Tidak ada URL konfigurasi di pengaturan aplikasi</string>
<string id="NoAPIKey" scope="glance">Tidak ada kunci API di pengaturan aplikasi</string>
<string id="NoApiUrl" scope="glance">Tidak ada URL API di pengaturan aplikasi</string>
<string id="NoConfigUrl" scope="glance">Tidak ada URL konfigurasi dalam pengaturan aplikasi</string>
<string id="ApiFlood">Panggilan API terlalu cepat. Harap memperlambat permintaan Anda.</string>
<string id="ApiUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL API dalam pengaturan.</string>
<string id="ConfigUrlNotFound">URL tidak ditemukan. Potensi kesalahan URL Konfigurasi dalam pengaturan.</string>
<string id="NoJson">Tidak ada JSON yang dikembalikan dari permintaan HTTP.</string>
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kode kesalahan =</string>
<string id="TrailingSlashErr">URL API tidak boleh memiliki garis miring '/'</string>
<string id="FetchingMenuConfig">Mengambil Konfigurasi Menu..</string>
<string id="ExitViewTouch">Geser ke Kanan untuk Keluar\nKetuk untuk Tetap</string>
<string id="ExitViewButtons">Tekan Kembali untuk Keluar\nMasuk untuk Tetap</string>
<string id="Available" scope="glance">Tersedia</string>
<string id="Checking" scope="glance">Memeriksa...</string>
<string id="Unavailable" scope="glance">Tidak tersedia</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Untuk pengaturan GUI -->
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Rubinetto</string>
<string id="MenuItemMenu">Menù</string>
<string id="Confirm">Sicuro?</string>
<string id="NoPhone">Nessuna connessione telefonica</string>
<string id="NoPhone" scope="glance">Nessuna connessione telefonica</string>
<string id="NoInternet">Nessuna connessione internet</string>
<string id="NoResponse">Nessuna risposta, controlla la connessione Internet</string>
<string id="NoMenu">Errore di recupero del menu</string>
<string id="NoAPIKey">Nessuna chiave API nelle impostazioni dell'applicazione</string>
<string id="NoApiUrl">Nessun URL API nelle impostazioni dell'applicazione</string>
<string id="NoConfigUrl">Nessun URL di configurazione nelle impostazioni dell'applicazione</string>
<string id="NoAPIKey" scope="glance">Nessuna chiave API nelle impostazioni dell'applicazione</string>
<string id="NoApiUrl" scope="glance">Nessun URL API nelle impostazioni dell'applicazione</string>
<string id="NoConfigUrl" scope="glance">Nessun URL di configurazione nelle impostazioni dell'applicazione</string>
<string id="ApiFlood">Chiamate API troppo rapide. Per favore rallenta le tue richieste.</string>
<string id="ApiUrlNotFound">URL non trovato. Potenziale errore URL API nelle impostazioni.</string>
<string id="ConfigUrlNotFound">URL non trovato. Potenziale errore dell'URL di configurazione nelle impostazioni.</string>
<string id="NoJson">Nessun JSON restituito dalla richiesta HTTP.</string>
<string id="UnhandledHttpErr">La richiesta HTTP ha restituito il codice di errore =</string>
<string id="TrailingSlashErr">L'URL dell'API non deve avere una barra finale "/"</string>
<string id="FetchingMenuConfig">Recupero configurazione menu..</string>
<string id="ExitViewTouch">Scorri verso destra per uscire\nTocca per restare</string>
<string id="ExitViewButtons">Premi Indietro per uscire\nInvio per restare</string>
<string id="Available" scope="glance">Disponibile</string>
<string id="Checking" scope="glance">Controllo...</string>
<string id="Unavailable" scope="glance">Non disponibile</string>
<string id="GlanceMenu" scope="glance">Menù</string>
<!-- Per la GUI delle impostazioni -->
<string id="SettingsApiKey">Chiave API per HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token di accesso di lunga durata.</string>

View File

@ -25,24 +25,25 @@
<string id="MenuItemTap">タップ</string>
<string id="MenuItemMenu">メニュー</string>
<string id="Confirm">もちろん?</string>
<string id="NoPhone">電話が接続されていません</string>
<string id="NoPhone" scope="glance">電話が接続されていません</string>
<string id="NoInternet">インターネット接続なし</string>
<string id="NoResponse">応答がありません。インターネット接続を確認してください</string>
<string id="NoMenu">メニューフェッチエラー</string>
<string id="NoAPIKey">アプリケーション設定に API キーがありません</string>
<string id="NoApiUrl">アプリケーション設定に API URL がありません</string>
<string id="NoConfigUrl">アプリケーション設定に構成 URL がありません</string>
<string id="NoAPIKey" scope="glance">アプリケーション設定に API キーがありません</string>
<string id="NoApiUrl" scope="glance">アプリケーション設定に API URL がありません</string>
<string id="NoConfigUrl" scope="glance">アプリケーション設定に構成 URL がありません</string>
<string id="ApiFlood">API 呼び出しが速すぎます。リクエストは遅くしてください。</string>
<string id="ApiUrlNotFound">URLが見つかりません。設定における API URL エラーの可能性があります。</string>
<string id="ConfigUrlNotFound">URLが見つかりません。設定内の構成 URL エラーの可能性があります。</string>
<string id="NoJson">HTTP リクエストから JSON が返されませんでした。</string>
<string id="UnhandledHttpErr">HTTP リクエストがエラー コードを返しました =</string>
<string id="TrailingSlashErr">API URL の末尾にスラッシュ「/」を含めることはできません</string>
<string id="FetchingMenuConfig">メニュー構成を取得しています。</string>
<string id="ExitViewTouch">右にスワイプして終了\nタップしてそのまま残ります</string>
<string id="ExitViewButtons">終了するには戻るキーを押してください\n続行するには Enter キーを押してください</string>
<string id="Available" scope="glance">利用可能</string>
<string id="Checking" scope="glance">チェック中...</string>
<string id="Unavailable" scope="glance">利用不可</string>
<string id="GlanceMenu" scope="glance">メニュー</string>
<!-- 設定GUIの場合 -->
<string id="SettingsApiKey">ホームアシスタントの API キー。</string>
<string id="SettingsApiKeyPrompt">有効期の長いアクセス トークン。</string>
<string id="SettingsApiKeyPrompt">有効期の長いアクセス トークン。</string>
<string id="SettingsApiUrl">ホームアシスタント API の URL。</string>
<string id="SettingsConfigUrl">メニュー構成の URL (JSON)。</string>
<string id="SettingsAppTimeout">秒単位のタイムアウト。デバイスのバッテリーを節約するために、この期間非アクティブになった後はアプリケーションを終了してください。</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">수도꼭지</string>
<string id="MenuItemMenu">메뉴</string>
<string id="Confirm">확신하는?</string>
<string id="NoPhone">전화 연결 없음</string>
<string id="NoPhone" scope="glance">전화 연결 없음</string>
<string id="NoInternet">인터넷에 연결되지 않음</string>
<string id="NoResponse">응답이 없습니다. 인터넷 연결을 확인하세요.</string>
<string id="NoMenu">메뉴 가져오기 오류</string>
<string id="NoAPIKey">애플리케이션 설정에 API 키가 없습니다.</string>
<string id="NoApiUrl">애플리케이션 설정에 API URL이 없습니다.</string>
<string id="NoConfigUrl">애플리케이션 설정에 구성 URL이 없습니다.</string>
<string id="NoAPIKey" scope="glance">애플리케이션 설정에 API 키가 없습니다.</string>
<string id="NoApiUrl" scope="glance">애플리케이션 설정에 API URL이 없습니다.</string>
<string id="NoConfigUrl" scope="glance">애플리케이션 설정에 구성 URL이 없습니다.</string>
<string id="ApiFlood">API 호출이 너무 빠릅니다. 요청 속도를 늦추시기 바랍니다.</string>
<string id="ApiUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 API URL 오류가 있습니다.</string>
<string id="ConfigUrlNotFound">URL을 찾을 수 없습니다. 설정에 잠재적인 구성 URL 오류가 있습니다.</string>
<string id="NoJson">HTTP 요청에서 JSON이 반환되지 않았습니다.</string>
<string id="UnhandledHttpErr">HTTP 요청이 오류 코드를 반환했습니다 =</string>
<string id="TrailingSlashErr">API URL에는 후행 슬래시 '/'가 없어야 합니다.</string>
<string id="FetchingMenuConfig">메뉴 구성을 가져오는 중..</string>
<string id="ExitViewTouch">종료하려면 오른쪽으로 스와이프하세요.\n계속 유지하려면 탭하세요.</string>
<string id="ExitViewButtons">종료하려면 뒤로 버튼을 누르세요.\n계속하려면 입력하세요.</string>
<string id="TrailingSlashErr">API URL에는 후행 슬래시 '/'가 있어서는 안 됩니다.</string>
<string id="Available" scope="glance">사용 가능</string>
<string id="Checking" scope="glance">확인 중...</string>
<string id="Unavailable" scope="glance">없는</string>
<string id="GlanceMenu" scope="glance">메뉴</string>
<!-- 설정 GUI의 경우 -->
<string id="SettingsApiKey">HomeAssistant용 API 키.</string>
<string id="SettingsApiKeyPrompt">장기 액세스 토큰.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Krāns</string>
<string id="MenuItemMenu">Izvēlne</string>
<string id="Confirm">Protams?</string>
<string id="NoPhone">Nav tālruņa savienojuma</string>
<string id="NoPhone" scope="glance">Nav tālruņa savienojuma</string>
<string id="NoInternet">Nav interneta savienojuma</string>
<string id="NoResponse">Nav atbildes, pārbaudiet interneta savienojumu</string>
<string id="NoMenu">Izvēlnes ielādes kļūda</string>
<string id="NoAPIKey">Lietojumprogrammas iestatījumos nav API atslēgas</string>
<string id="NoApiUrl">Lietojumprogrammas iestatījumos nav API URL</string>
<string id="NoConfigUrl">Lietojumprogrammas iestatījumos nav konfigurācijas URL</string>
<string id="NoAPIKey" scope="glance">Lietojumprogrammas iestatījumos nav API atslēgas</string>
<string id="NoApiUrl" scope="glance">Lietojumprogrammas iestatījumos nav API URL</string>
<string id="NoConfigUrl" scope="glance">Lietojumprogrammas iestatījumos nav konfigurācijas URL</string>
<string id="ApiFlood">API izsaukumi ir pārāk ātri. Lūdzu, palēniniet pieprasījumu izpildi.</string>
<string id="ApiUrlNotFound">URL nav atrasts. Iespējama API URL kļūda iestatījumos.</string>
<string id="ConfigUrlNotFound">URL nav atrasts. Iespējama konfigurācijas URL kļūda iestatījumos.</string>
<string id="NoJson">No HTTP pieprasījuma netika atgriezts neviens JSON fails.</string>
<string id="UnhandledHttpErr">HTTP pieprasījums atgrieza kļūdas kodu =</string>
<string id="TrailingSlashErr">API URL beigās nedrīkst būt slīpsvītra “/”</string>
<string id="FetchingMenuConfig">Notiek izvēlnes konfigurācijas iegūšana...</string>
<string id="ExitViewTouch">Lai izietu, velciet pa labi\nPieskarieties, lai paliktu</string>
<string id="ExitViewButtons">Noklikšķiniet uz Atpakaļ, lai izietu.\nIevadiet, lai paliktu</string>
<string id="Available" scope="glance">Pieejams</string>
<string id="Checking" scope="glance">Notiek pārbaude...</string>
<string id="Unavailable" scope="glance">Nav pieejams</string>
<string id="GlanceMenu" scope="glance">Izvēlne</string>
<!-- Iestatījumu GUI -->
<string id="SettingsApiKey">API atslēga Home Assistant.</string>
<string id="SettingsApiKeyPrompt">Ilgmūžīgs piekļuves marķieris.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Bakstelėkite</string>
<string id="MenuItemMenu">Meniu</string>
<string id="Confirm">Žinoma?</string>
<string id="NoPhone">Nėra telefono ryšio</string>
<string id="NoPhone" scope="glance">Nėra telefono ryšio</string>
<string id="NoInternet">Nėra interneto ryšio</string>
<string id="NoResponse">Neatsako, patikrinkite interneto ryšį</string>
<string id="NoMenu">Meniu gavimo klaida</string>
<string id="NoAPIKey">Programos nustatymuose nėra API rakto</string>
<string id="NoApiUrl">Programos nustatymuose nėra API URL</string>
<string id="NoConfigUrl">Programos nustatymuose nėra konfigūracijos URL</string>
<string id="NoAPIKey" scope="glance">Programos nustatymuose nėra API rakto</string>
<string id="NoApiUrl" scope="glance">Programos nustatymuose nėra API URL</string>
<string id="NoConfigUrl" scope="glance">Programos nustatymuose nėra konfigūracijos URL</string>
<string id="ApiFlood">API skambučiai per greiti. Sulėtinkite prašymų vykdymą.</string>
<string id="ApiUrlNotFound">URL nerastas. Galima API URL klaida nustatymuose.</string>
<string id="ConfigUrlNotFound">URL nerastas. Galima konfigūracijos URL klaida nustatymuose.</string>
<string id="NoJson">Joks JSON negrąžintas iš HTTP užklausos.</string>
<string id="UnhandledHttpErr">HTTP užklausa grąžino klaidos kodą =</string>
<string id="TrailingSlashErr">API URL pabaigoje negali būti pasvirojo brūkšnio „/“</string>
<string id="FetchingMenuConfig">Gaunama meniu konfigūracija...</string>
<string id="ExitViewTouch">Norėdami išeiti, braukite į dešinę\nPalieskite, kad pasiliktumėte</string>
<string id="ExitViewButtons">Norėdami išeiti, paspauskite „Atgal“.\nĮveskite, kad pasiliktumėte</string>
<string id="Available" scope="glance">Yra</string>
<string id="Checking" scope="glance">Tikrinama...</string>
<string id="Unavailable" scope="glance">Nepasiekiamas</string>
<string id="GlanceMenu" scope="glance">Meniu</string>
<!-- Dėl nustatymų GUI -->
<string id="SettingsApiKey">API raktas, skirtas „HomeAssistant“.</string>
<string id="SettingsApiKeyPrompt">Ilgalaikis prieigos raktas.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Trykk på</string>
<string id="MenuItemMenu">Meny</string>
<string id="Confirm">Sikker?</string>
<string id="NoPhone">Ingen telefonforbindelse</string>
<string id="NoPhone" scope="glance">Ingen telefonforbindelse</string>
<string id="NoInternet">Ingen Internett-tilkobling</string>
<string id="NoResponse">Ingen svar, sjekk Internett-tilkoblingen</string>
<string id="NoMenu">Menyhentingsfeil</string>
<string id="NoAPIKey">Ingen API-nøkkel i applikasjonsinnstillingene</string>
<string id="NoApiUrl">Ingen API-URL i applikasjonsinnstillingene</string>
<string id="NoConfigUrl">Ingen konfigurasjons-URL i applikasjonsinnstillingene</string>
<string id="NoAPIKey" scope="glance">Ingen API-nøkkel i applikasjonsinnstillingene</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikasjonsinnstillingene</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurasjons-URL i applikasjonsinnstillingene</string>
<string id="ApiFlood">API-kall for raske. Vennligst senke forespørslene dine.</string>
<string id="ApiUrlNotFound">Finner ikke URL. Potensiell API URL-feil i innstillingene.</string>
<string id="ConfigUrlNotFound">Finner ikke URL. Potensiell konfigurasjons-URL-feil i innstillingene.</string>
<string id="NoJson">Ingen JSON returnert fra HTTP-forespørsel.</string>
<string id="UnhandledHttpErr">HTTP-forespørsel returnerte feilkode =</string>
<string id="TrailingSlashErr">API URL må ikke ha en etterfølgende skråstrek '/'</string>
<string id="FetchingMenuConfig">Henter menykonfigurasjon..</string>
<string id="ExitViewTouch">Sveip til høyre for å avslutte\nTrykk for å bli</string>
<string id="ExitViewButtons">Trykk Tilbake for å avslutte\nEnter for å bli</string>
<string id="Available" scope="glance">Tilgjengelig</string>
<string id="Checking" scope="glance">Sjekker...</string>
<string id="Unavailable" scope="glance">Utilgjengelig</string>
<string id="GlanceMenu" scope="glance">Meny</string>
<!-- For innstillingene GUI -->
<string id="SettingsApiKey">API-nøkkel for HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Langlevd tilgangstoken.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Uzyskiwać</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Jasne?</string>
<string id="NoPhone">Brak połączenia telefonicznego</string>
<string id="NoPhone" scope="glance">Brak połączenia telefonicznego</string>
<string id="NoInternet">Brak połączenia z internetem</string>
<string id="NoResponse">Brak odpowiedzi, sprawdź połączenie internetowe</string>
<string id="NoMenu">Błąd pobierania menu</string>
<string id="NoAPIKey">Brak klucza API w ustawieniach aplikacji</string>
<string id="NoApiUrl">Brak adresu API w ustawieniach aplikacji</string>
<string id="NoConfigUrl">Brak adresu URL konfiguracji w ustawieniach aplikacji</string>
<string id="NoAPIKey" scope="glance">Brak klucza API w ustawieniach aplikacji</string>
<string id="NoApiUrl" scope="glance">Brak adresu API w ustawieniach aplikacji</string>
<string id="NoConfigUrl" scope="glance">Brak adresu URL konfiguracji w ustawieniach aplikacji</string>
<string id="ApiFlood">Wywołania API są zbyt szybkie. Proszę spowolnić swoje żądania.</string>
<string id="ApiUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL interfejsu API w ustawieniach.</string>
<string id="ConfigUrlNotFound">Nie znaleziono adresu URL. Potencjalny błąd adresu URL konfiguracji w ustawieniach.</string>
<string id="NoJson">Z żądania HTTP nie zwrócono żadnego kodu JSON.</string>
<string id="UnhandledHttpErr">Żądanie HTTP zwróciło kod błędu =</string>
<string id="TrailingSlashErr">Adres URL interfejsu API nie może zawierać końcowego ukośnika „/”</string>
<string id="FetchingMenuConfig">Pobieranie konfiguracji menu..</string>
<string id="ExitViewTouch">Przesuń w prawo, aby wyjść\nDotknij, aby pozostać</string>
<string id="ExitViewButtons">Naciśnij Wstecz, aby wyjść\nEnter, aby pozostać</string>
<string id="Available" scope="glance">Dostępny</string>
<string id="Checking" scope="glance">Kontrola...</string>
<string id="Unavailable" scope="glance">Niedostępne</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Dla ustawień GUI -->
<string id="SettingsApiKey">Klucz API dla HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Długowieczny token dostępu.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Tocar</string>
<string id="MenuItemMenu">Cardápio</string>
<string id="Confirm">Claro?</string>
<string id="NoPhone">Sem conexão telefônica</string>
<string id="NoPhone" scope="glance">Sem conexão telefônica</string>
<string id="NoInternet">Sem conexão com a Internet</string>
<string id="NoResponse">Sem resposta, verifique a conexão com a Internet</string>
<string id="NoMenu">Erro ao buscar menu</string>
<string id="NoAPIKey">Nenhuma chave de API nas configurações do aplicativo</string>
<string id="NoApiUrl">Nenhum URL de API nas configurações do aplicativo</string>
<string id="NoConfigUrl">Nenhum URL de configuração nas configurações do aplicativo</string>
<string id="NoAPIKey" scope="glance">Nenhuma chave de API nas configurações do aplicativo</string>
<string id="NoApiUrl" scope="glance">Nenhum URL de API nas configurações do aplicativo</string>
<string id="NoConfigUrl" scope="glance">Nenhum URL de configuração nas configurações do aplicativo</string>
<string id="ApiFlood">Chamadas de API muito rápidas. Por favor, diminua a velocidade de seus pedidos.</string>
<string id="ApiUrlNotFound">URL não encontrado. Possível erro de URL da API nas configurações.</string>
<string id="ConfigUrlNotFound">URL não encontrado. Possível erro de URL de configuração nas configurações.</string>
<string id="NoJson">Nenhum JSON foi retornado da solicitação HTTP.</string>
<string id="UnhandledHttpErr">Solicitação HTTP retornou código de erro =</string>
<string id="TrailingSlashErr">O URL da API não deve ter uma barra final '/'</string>
<string id="FetchingMenuConfig">Buscando configuração do menu..</string>
<string id="ExitViewTouch">Deslize para a direita para sair\nToque para permanecer</string>
<string id="ExitViewButtons">Volte para sair\nEntre para ficar</string>
<string id="Available" scope="glance">Disponível</string>
<string id="Checking" scope="glance">Verificando...</string>
<string id="Unavailable" scope="glance">Indisponível</string>
<string id="GlanceMenu" scope="glance">Cardápio</string>
<!-- Para a GUI de configurações -->
<string id="SettingsApiKey">Chave de API para HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token de acesso de longa duração.</string>

View File

@ -21,25 +21,26 @@
<strings>
<string id="AppName" scope="glance">HomeAssistant</string>
<string id="MenuItemOn">Pe</string>
<string id="MenuItemOff">Oprit</string>
<string id="MenuItemOff">Off</string>
<string id="MenuItemTap">Atingeți</string>
<string id="MenuItemMenu">Meniul</string>
<string id="Confirm">Sigur?</string>
<string id="NoPhone">Fără conexiune telefonică</string>
<string id="NoPhone" scope="glance">Fără conexiune telefonică</string>
<string id="NoInternet">Fără conexiune internet</string>
<string id="NoResponse">Niciun răspuns, verificați conexiunea la internet</string>
<string id="NoMenu">Eroare de preluare a meniului</string>
<string id="NoAPIKey">Nicio cheie API în setările aplicației</string>
<string id="NoApiUrl">Nicio adresă URL API în setările aplicației</string>
<string id="NoConfigUrl">Nicio adresă URL de configurare în setările aplicației</string>
<string id="NoAPIKey" scope="glance">Nicio cheie API în setările aplicației</string>
<string id="NoApiUrl" scope="glance">Nicio adresă URL API în setările aplicației</string>
<string id="NoConfigUrl" scope="glance">Nicio adresă URL de configurare în setările aplicației</string>
<string id="ApiFlood">Apeluri API prea rapide. Vă rugăm să încetiniți cererile dvs.</string>
<string id="ApiUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL API în setări.</string>
<string id="ConfigUrlNotFound">Adresa URL nu a fost găsită. Potențială eroare URL de configurare în setări.</string>
<string id="NoJson">Niciun JSON nu a fost returnat de la solicitarea HTTP.</string>
<string id="UnhandledHttpErr">Solicitarea HTTP a returnat codul de eroare =</string>
<string id="TrailingSlashErr">Adresa URL API nu trebuie să aibă o bară oblică „/”</string>
<string id="FetchingMenuConfig">Se preiau configurarea meniului...</string>
<string id="ExitViewTouch">Glisați spre dreapta pentru a ieși\nAtingeți pentru a rămâne</string>
<string id="ExitViewButtons">Apăsați Înapoi pentru a ieși\nIntră pentru a rămâne</string>
<string id="Available" scope="glance">Disponibil</string>
<string id="Checking" scope="glance">Control...</string>
<string id="Unavailable" scope="glance">Indisponibil</string>
<string id="GlanceMenu" scope="glance">Meniul</string>
<!-- Pentru GUI de setări -->
<string id="SettingsApiKey">Cheie API pentru HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token de acces cu viață lungă.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Klepnite</string>
<string id="MenuItemMenu">Ponuka</string>
<string id="Confirm">Samozrejme?</string>
<string id="NoPhone">Žiadne telefónne spojenie</string>
<string id="NoPhone" scope="glance">Žiadne telefónne spojenie</string>
<string id="NoInternet">Žiadne internetové pripojenie</string>
<string id="NoResponse">Žiadna odpoveď, skontrolujte internetové pripojenie</string>
<string id="NoMenu">Chyba načítania ponuky</string>
<string id="NoAPIKey">V nastaveniach aplikácie nie je žiadny kľúč API</string>
<string id="NoApiUrl">V nastaveniach aplikácie nie je žiadna adresa URL rozhrania API</string>
<string id="NoConfigUrl">V nastaveniach aplikácie nie je žiadna konfiguračná URL</string>
<string id="NoAPIKey" scope="glance">V nastaveniach aplikácie nie je žiadny kľúč API</string>
<string id="NoApiUrl" scope="glance">V nastaveniach aplikácie nie je žiadna adresa URL rozhrania API</string>
<string id="NoConfigUrl" scope="glance">V nastaveniach aplikácie nie je žiadna konfiguračná URL</string>
<string id="ApiFlood">Volania API sú príliš rýchle. Spomaľte svoje požiadavky.</string>
<string id="ApiUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba webovej adresy rozhrania API v nastaveniach.</string>
<string id="ConfigUrlNotFound">Adresa URL sa nenašla. Potenciálna chyba konfiguračnej adresy URL v nastaveniach.</string>
<string id="NoJson">Z požiadavky HTTP sa nevrátil žiadny JSON.</string>
<string id="UnhandledHttpErr">Požiadavka HTTP vrátila kód chyby =</string>
<string id="TrailingSlashErr">Adresa URL rozhrania API nesmie obsahovať koncovú lomku „/“</string>
<string id="FetchingMenuConfig">Načítava sa konfigurácia ponuky...</string>
<string id="ExitViewTouch">Ukončite prejdením prstom doprava\nKlepnutím zostanete</string>
<string id="ExitViewButtons">Stlačte Späť na ukončenie\nVstúpte a zostaňte</string>
<string id="Available" scope="glance">Dostupné</string>
<string id="Checking" scope="glance">Prebieha kontrola...</string>
<string id="Unavailable" scope="glance">nedostupné</string>
<string id="GlanceMenu" scope="glance">Ponuka</string>
<!-- Pre nastavenia GUI -->
<string id="SettingsApiKey">Kľúč API pre HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Dlhotrvajúci prístupový token.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Tapnite</string>
<string id="MenuItemMenu">meni</string>
<string id="Confirm">Seveda?</string>
<string id="NoPhone">Ni telefonske povezave</string>
<string id="NoPhone" scope="glance">Ni telefonske povezave</string>
<string id="NoInternet">Ni internetne povezave</string>
<string id="NoResponse">Ni odgovora, preverite internetno povezavo</string>
<string id="NoMenu">Napaka pri pridobivanju menija</string>
<string id="NoAPIKey">V nastavitvah aplikacije ni ključa API</string>
<string id="NoApiUrl">V nastavitvah aplikacije ni URL-ja API-ja</string>
<string id="NoConfigUrl">V nastavitvah aplikacije ni konfiguracijskega URL-ja</string>
<string id="NoAPIKey" scope="glance">V nastavitvah aplikacije ni ključa API</string>
<string id="NoApiUrl" scope="glance">V nastavitvah aplikacije ni URL-ja API-ja</string>
<string id="NoConfigUrl" scope="glance">V nastavitvah aplikacije ni konfiguracijskega URL-ja</string>
<string id="ApiFlood">API klici so prehitri. Prosim, upočasnite svoje zahteve.</string>
<string id="ApiUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja API-ja v nastavitvah.</string>
<string id="ConfigUrlNotFound">URL-ja ni bilo mogoče najti. Morebitna napaka URL-ja konfiguracije v nastavitvah.</string>
<string id="NoJson">Zahteva HTTP ni vrnila JSON.</string>
<string id="UnhandledHttpErr">Zahteva HTTP je vrnila kodo napake =</string>
<string id="TrailingSlashErr">URL API-ja ne sme imeti končne poševnice '/'</string>
<string id="FetchingMenuConfig">Pridobivanje konfiguracije menija..</string>
<string id="ExitViewTouch">Povlecite v desno za izhod\nDotaknite se, da ostanete</string>
<string id="ExitViewButtons">Pritisnite Nazaj za izhod\nVstopite, da ostanete</string>
<string id="Available" scope="glance">Na voljo</string>
<string id="Checking" scope="glance">Preverjanje ...</string>
<string id="Unavailable" scope="glance">Ni na voljo</string>
<string id="GlanceMenu" scope="glance">meni</string>
<!-- Za nastavitve GUI -->
<string id="SettingsApiKey">API ključ za HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Dolgoživ dostopni žeton.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Grifo</string>
<string id="MenuItemMenu">Menú</string>
<string id="Confirm">¿Seguro?</string>
<string id="NoPhone">Sin conexión telefónica</string>
<string id="NoPhone" scope="glance">Sin conexión telefónica</string>
<string id="NoInternet">Sin conexión a Internet</string>
<string id="NoResponse">No hay respuesta, verifique la conexión a Internet</string>
<string id="NoMenu">Error de recuperación del menú</string>
<string id="NoAPIKey">Sin clave API en la configuración de la aplicación</string>
<string id="NoApiUrl">No hay URL de API en la configuración de la aplicación</string>
<string id="NoConfigUrl">No hay URL de configuración en la configuración de la aplicación.</string>
<string id="NoAPIKey" scope="glance">Sin clave API en la configuración de la aplicación</string>
<string id="NoApiUrl" scope="glance">No hay URL de API en la configuración de la aplicación</string>
<string id="NoConfigUrl" scope="glance">No hay URL de configuración en la configuración de la aplicación.</string>
<string id="ApiFlood">Llamadas API demasiado rápidas. Por favor, ralentice sus solicitudes.</string>
<string id="ApiUrlNotFound">URL no encontrada. Posible error de URL de API en la configuración.</string>
<string id="ConfigUrlNotFound">URL no encontrada. Posible error de URL de configuración en la configuración.</string>
<string id="NoJson">No se devolvió ningún JSON de la solicitud HTTP.</string>
<string id="UnhandledHttpErr">La solicitud HTTP devolvió el código de error =</string>
<string id="TrailingSlashErr">La URL de API no debe tener una barra diagonal '/'</string>
<string id="FetchingMenuConfig">Obteniendo configuración del menú..</string>
<string id="ExitViewTouch">Desliza hacia la derecha para salir\nToca para permanecer</string>
<string id="ExitViewButtons">Presione Atrás para salir\nEntrar para permanecer</string>
<string id="Available" scope="glance">Disponible</string>
<string id="Checking" scope="glance">Comprobación...</string>
<string id="Unavailable" scope="glance">Indisponible</string>
<string id="GlanceMenu" scope="glance">Menú</string>
<!-- Para la configuración GUI -->
<string id="SettingsApiKey">Clave API para HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token de acceso de larga duración.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Knacka</string>
<string id="MenuItemMenu">Meny</string>
<string id="Confirm">Säker?</string>
<string id="NoPhone">Ingen telefonanslutning</string>
<string id="NoPhone" scope="glance">Ingen telefonanslutning</string>
<string id="NoInternet">Ingen internetanslutning</string>
<string id="NoResponse">Inget svar, kontrollera internetanslutningen</string>
<string id="NoMenu">Menyhämtningsfel</string>
<string id="NoAPIKey">Ingen API-nyckel i applikationsinställningarna</string>
<string id="NoApiUrl">Ingen API-URL i applikationsinställningarna</string>
<string id="NoConfigUrl">Ingen konfigurations-URL i programinställningarna</string>
<string id="NoAPIKey" scope="glance">Ingen API-nyckel i applikationsinställningarna</string>
<string id="NoApiUrl" scope="glance">Ingen API-URL i applikationsinställningarna</string>
<string id="NoConfigUrl" scope="glance">Ingen konfigurations-URL i programinställningarna</string>
<string id="ApiFlood">API-anrop för snabba. Vänligen sakta ner dina förfrågningar.</string>
<string id="ApiUrlNotFound">Webbadressen hittades inte. Potentiellt API-URL-fel i inställningarna.</string>
<string id="ConfigUrlNotFound">Webbadressen hittades inte. Potentiellt konfigurations-URL-fel i inställningarna.</string>
<string id="NoJson">Ingen JSON returnerades från HTTP-begäran.</string>
<string id="UnhandledHttpErr">HTTP-begäran returnerade felkod =</string>
<string id="TrailingSlashErr">API-URL får inte ha ett snedstreck '/'</string>
<string id="FetchingMenuConfig">Hämtar menykonfiguration..</string>
<string id="ExitViewTouch">Svep åt höger för att avsluta\nKnacka för att stanna</string>
<string id="ExitViewButtons">Tryck på Tillbaka för att avsluta\nEnter för att stanna</string>
<string id="Available" scope="glance">Tillgängliga</string>
<string id="Checking" scope="glance">Kontroll...</string>
<string id="Unavailable" scope="glance">Inte tillgänglig</string>
<string id="GlanceMenu" scope="glance">Meny</string>
<!-- För inställningar GUI -->
<string id="SettingsApiKey">API-nyckel för HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Långlivad åtkomsttoken.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">แตะ</string>
<string id="MenuItemMenu">เมนู</string>
<string id="Confirm">แน่นอน?</string>
<string id="NoPhone">ไม่มีการเชื่อมต่อโทรศัพท์</string>
<string id="NoPhone" scope="glance">ไม่มีการเชื่อมต่อโทรศัพท์</string>
<string id="NoInternet">ไม่มีการเชื่อมต่ออินเทอร์เน็ต</string>
<string id="NoResponse">ไม่มีการตอบสนอง ตรวจสอบการเชื่อมต่ออินเทอร์เน็ต</string>
<string id="NoMenu">เมนูดึงข้อมูลผิดพลาด</string>
<string id="NoAPIKey">ไม่มีคีย์ API ในการตั้งค่าแอปพลิเคชัน</string>
<string id="NoApiUrl">ไม่มี URL API ในการตั้งค่าแอปพลิเคชัน</string>
<string id="NoConfigUrl">ไม่มี URL การกำหนดค่าในการตั้งค่าแอปพลิเคชัน</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="ApiFlood">การเรียก API เร็วเกินไป กรุณาชะลอคำขอของคุณ</string>
<string id="ApiUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL API ที่อาจเกิดขึ้นในการตั้งค่า</string>
<string id="ConfigUrlNotFound">ไม่พบ URL ข้อผิดพลาด URL การกำหนดค่าที่อาจเกิดขึ้นในการตั้งค่า</string>
<string id="NoJson">ไม่มี JSON ที่ส่งคืนจากคำขอ HTTP</string>
<string id="UnhandledHttpErr">คำขอ HTTP ส่งคืนรหัสข้อผิดพลาด =</string>
<string id="TrailingSlashErr">URL ของ API ต้องไม่มีเครื่องหมายทับต่อท้าย '/'</string>
<string id="FetchingMenuConfig">กำลังดึงข้อมูลการกำหนดค่าเมนู..</string>
<string id="ExitViewTouch">ปัดไปทางขวาเพื่อออก\nแตะเพื่ออยู่ต่อ</string>
<string id="ExitViewButtons">กดกลับเพื่อออก\nเข้าไปเพื่ออยู่ต่อ</string>
<string id="Available" scope="glance">มีอยู่</string>
<string id="Checking" scope="glance">กำลังตรวจสอบ...</string>
<string id="Unavailable" scope="glance">ไม่พร้อมใช้งาน</string>
<string id="GlanceMenu" scope="glance">เมนู</string>
<!-- สำหรับการตั้งค่า GUI -->
<string id="SettingsApiKey">คีย์ API สำหรับ HomeAssistant</string>
<string id="SettingsApiKeyPrompt">โทเค็นการเข้าถึงที่มีอายุการใช้งานยาวนาน</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Musluk</string>
<string id="MenuItemMenu">Menü</string>
<string id="Confirm">Elbette?</string>
<string id="NoPhone">Telefon bağlantısı yok</string>
<string id="NoPhone" scope="glance">Telefon bağlantısı yok</string>
<string id="NoInternet">İnternet bağlantısı yok</string>
<string id="NoResponse">Yanıt Yok, İnternet bağlantısını kontrol edin</string>
<string id="NoMenu">Menü Alma Hatası</string>
<string id="NoAPIKey">Uygulama ayarlarında API anahtarı yok</string>
<string id="NoApiUrl">Uygulama ayarlarında API URL'si yok</string>
<string id="NoConfigUrl">Uygulama ayarlarında yapılandırma URL'si yok</string>
<string id="NoAPIKey" scope="glance">Uygulama ayarlarında API anahtarı yok</string>
<string id="NoApiUrl" scope="glance">Uygulama ayarlarında API URL'si yok</string>
<string id="NoConfigUrl" scope="glance">Uygulama ayarlarında yapılandırma URL'si yok</string>
<string id="ApiFlood">API çağrıları çok hızlı. Lütfen isteklerinizi yavaşlatın.</string>
<string id="ApiUrlNotFound">URL bulunamadı. Ayarlarda olası API URL hatası.</string>
<string id="ConfigUrlNotFound">URL bulunamadı. Ayarlarda Olası Yapılandırma URL'si hatası.</string>
<string id="NoJson">HTTP isteğinden JSON döndürülmedi.</string>
<string id="UnhandledHttpErr">HTTP isteği hata kodunu döndürdü =</string>
<string id="TrailingSlashErr">API URL'sinin sonunda eğik çizgi '/' olmamalıdır</string>
<string id="FetchingMenuConfig">Menü Yapılandırması alınıyor..</string>
<string id="ExitViewTouch">Çıkmak için Sağa Kaydırın\nKalmak için Dokunun</string>
<string id="ExitViewButtons">Çıkış için Geri tuşuna basın\nKalmak için Enter'a basın</string>
<string id="TrailingSlashErr">API URL'sinin sonunda '/' eğik çizgi olmamalıdır</string>
<string id="Available" scope="glance">Mevcut</string>
<string id="Checking" scope="glance">Kontrol etme...</string>
<string id="Unavailable" scope="glance">Kullanım dışı</string>
<string id="GlanceMenu" scope="glance">Menü</string>
<!-- Ayarlar GUI'si için -->
<string id="SettingsApiKey">HomeAssistant için API Anahtarı.</string>
<string id="SettingsApiKeyPrompt">Uzun Ömürlü Erişim Jetonu.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Торкніться</string>
<string id="MenuItemMenu">Меню</string>
<string id="Confirm">Зрозуміло?</string>
<string id="NoPhone">Немає телефонного зв'язку</string>
<string id="NoPhone" scope="glance">Немає телефонного зв'язку</string>
<string id="NoInternet">Немає підключення до Інтернету</string>
<string id="NoResponse">Немає відповіді, перевірте підключення до Інтернету</string>
<string id="NoMenu">Помилка вибірки меню</string>
<string id="NoAPIKey">У налаштуваннях програми немає ключа API</string>
<string id="NoApiUrl">У налаштуваннях програми немає URL-адреси API</string>
<string id="NoConfigUrl">У налаштуваннях програми немає URL-адреси конфігурації</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="ApiFlood">Надто швидкі виклики API. Будь ласка, сповільніть свої запити.</string>
<string id="ApiUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси API в налаштуваннях.</string>
<string id="ConfigUrlNotFound">URL не знайдено. Потенційна помилка URL-адреси конфігурації в налаштуваннях.</string>
<string id="NoJson">Запит HTTP не повертає JSON.</string>
<string id="UnhandledHttpErr">Запит HTTP повернув код помилки =</string>
<string id="TrailingSlashErr">URL-адреса API не повинна містити косу риску '/'</string>
<string id="FetchingMenuConfig">Отримання конфігурації меню..</string>
<string id="ExitViewTouch">Проведіть праворуч, щоб вийти\nТоркніться, щоб залишитися</string>
<string id="ExitViewButtons">Натисніть «Назад», щоб вийти\nВведіть, щоб залишитися</string>
<string id="Available" scope="glance">в наявності</string>
<string id="Checking" scope="glance">Перевірка...</string>
<string id="Unavailable" scope="glance">Недоступний</string>
<string id="GlanceMenu" scope="glance">Меню</string>
<!-- Для налаштування GUI -->
<string id="SettingsApiKey">Ключ API для HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Довговічний маркер доступу.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Vỗ nhẹ</string>
<string id="MenuItemMenu">Thực đơn</string>
<string id="Confirm">Chắc chắn?</string>
<string id="NoPhone">Không có kết nối điện thoại</string>
<string id="NoPhone" scope="glance">Không có kết nối điện thoại</string>
<string id="NoInternet">Không có kết nối Internet</string>
<string id="NoResponse">Không có phản hồi, kiểm tra kết nối Internet</string>
<string id="NoMenu">Lỗi tìm nạp menu</string>
<string id="NoAPIKey">Không có khóa API trong cài đặt ứng dụng</string>
<string id="NoApiUrl">Không có URL API trong cài đặt ứng dụng</string>
<string id="NoConfigUrl">Không có URL cấu hình trong cài đặt ứng dụng</string>
<string id="NoAPIKey" scope="glance">Không có khóa API trong cài đặt ứng dụng</string>
<string id="NoApiUrl" scope="glance">Không có URL API trong cài đặt ứng dụng</string>
<string id="NoConfigUrl" scope="glance">Không có URL cấu hình trong cài đặt ứng dụng</string>
<string id="ApiFlood">Cuộc gọi API quá nhanh. Hãy làm chậm yêu cầu của bạn.</string>
<string id="ApiUrlNotFound">Không tìm thấy URL. Lỗi URL API tiềm ẩn trong cài đặt.</string>
<string id="ConfigUrlNotFound">Không tìm thấy URL. Lỗi URL cấu hình tiềm ẩn trong cài đặt.</string>
<string id="NoJson">Không có JSON nào được trả về từ yêu cầu HTTP.</string>
<string id="UnhandledHttpErr">Yêu cầu HTTP trả về mã lỗi =</string>
<string id="TrailingSlashErr">URL API không được có dấu gạch chéo ở cuối '/'</string>
<string id="FetchingMenuConfig">Đang tìm nạp cấu hình menu..</string>
<string id="ExitViewTouch">Vuốt sang phải để thoát\nNhấn để ở lại</string>
<string id="ExitViewButtons">Nhấn Quay lại để thoát\nNhập để ở lại</string>
<string id="Available" scope="glance">Có sẵn</string>
<string id="Checking" scope="glance">Đang kiểm tra...</string>
<string id="Unavailable" scope="glance">Không có sẵn</string>
<string id="GlanceMenu" scope="glance">Thực đơn</string>
<!-- Đối với GUI cài đặt -->
<string id="SettingsApiKey">Khóa API cho HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Mã thông báo truy cập tồn tại lâu dài.</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">轻敲</string>
<string id="MenuItemMenu">菜单</string>
<string id="Confirm">当然?</string>
<string id="NoPhone">没有电话连接</string>
<string id="NoPhone" scope="glance">没有电话连接</string>
<string id="NoInternet">没有网络连接</string>
<string id="NoResponse">无响应,请检查互联网连接</string>
<string id="NoMenu">菜单获取错误</string>
<string id="NoAPIKey">应用程序设置中没有 API 密钥</string>
<string id="NoApiUrl">应用程序设置中没有 API URL</string>
<string id="NoConfigUrl">应用程序设置中没有配置 URL</string>
<string id="NoAPIKey" scope="glance">应用程序设置中没有 API 密钥</string>
<string id="NoApiUrl" scope="glance">应用程序设置中没有 API URL</string>
<string id="NoConfigUrl" scope="glance">应用程序设置中没有配置 URL</string>
<string id="ApiFlood">API 调用速度太快。请放慢您的请求。</string>
<string id="ApiUrlNotFound">找不到网址。设置中可能存在 API URL 错误。</string>
<string id="ConfigUrlNotFound">找不到网址。设置中可能存在配置 URL 错误。</string>
<string id="NoJson">HTTP 请求未返回 JSON。</string>
<string id="UnhandledHttpErr">HTTP请求返回错误码=</string>
<string id="TrailingSlashErr">API URL 不得有尾部斜杠“/”</string>
<string id="FetchingMenuConfig">正在获取菜单配置..</string>
<string id="ExitViewTouch">向右滑动即可退出\n点击即可停留</string>
<string id="ExitViewButtons">按回车键退出\n按回车键继续</string>
<string id="Available" scope="glance">可用的</string>
<string id="Checking" scope="glance">检查...</string>
<string id="Unavailable" scope="glance">不可用</string>
<string id="GlanceMenu" scope="glance">菜单</string>
<!-- 对于设置 GUI -->
<string id="SettingsApiKey">HomeAssistant 的 API 密钥。</string>
<string id="SettingsApiKeyPrompt">长期访问令牌。</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">輕敲</string>
<string id="MenuItemMenu">選單</string>
<string id="Confirm">當然?</string>
<string id="NoPhone">沒有電話連接</string>
<string id="NoPhone" scope="glance">沒有電話連接</string>
<string id="NoInternet">沒有網路連線</string>
<string id="NoResponse">無響應,請檢查互聯網連接</string>
<string id="NoMenu">選單取得錯誤</string>
<string id="NoAPIKey">應用程式設定中沒有 API 金鑰</string>
<string id="NoApiUrl">應用程式設定中沒有 API URL</string>
<string id="NoConfigUrl">應用程式設定中沒有配置 URL</string>
<string id="NoAPIKey" scope="glance">應用程式設定中沒有 API 金鑰</string>
<string id="NoApiUrl" scope="glance">應用程式設定中沒有 API URL</string>
<string id="NoConfigUrl" scope="glance">應用程式設定中沒有配置 URL</string>
<string id="ApiFlood">API 呼叫速度太快。請放慢您的請求。</string>
<string id="ApiUrlNotFound">找不到網址。設定中可能存在 API URL 錯誤。</string>
<string id="ConfigUrlNotFound">找不到網址。設定中可能存在配置 URL 錯誤。</string>
<string id="NoJson">HTTP 請求未傳回 JSON。</string>
<string id="UnhandledHttpErr">HTTP請求回傳錯誤碼=</string>
<string id="TrailingSlashErr">API URL 不得有尾部斜線“/”</string>
<string id="FetchingMenuConfig">正在取得選單配置..</string>
<string id="ExitViewTouch">向右滑動即可退出\n點選即可停留</string>
<string id="ExitViewButtons">按回車鍵退出\n按回車鍵繼續</string>
<string id="Available" scope="glance">可用的</string>
<string id="Checking" scope="glance">檢查...</string>
<string id="Unavailable" scope="glance">不可用</string>
<string id="GlanceMenu" scope="glance">選單</string>
<!-- 對於設定 GUI -->
<string id="SettingsApiKey">HomeAssistant 的 API 金鑰。</string>
<string id="SettingsApiKeyPrompt">長期訪問令牌。</string>

View File

@ -25,21 +25,22 @@
<string id="MenuItemTap">Ketik</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">pasti?</string>
<string id="NoPhone">Tiada sambungan Telefon</string>
<string id="NoPhone" scope="glance">Tiada sambungan Telefon</string>
<string id="NoInternet">Tiada sambungan internet</string>
<string id="NoResponse">Tiada Respons, semak sambungan Internet</string>
<string id="NoMenu">Ralat Pengambilan Menu</string>
<string id="NoAPIKey">Tiada kunci API dalam tetapan aplikasi</string>
<string id="NoApiUrl">Tiada URL API dalam tetapan aplikasi</string>
<string id="NoConfigUrl">Tiada URL konfigurasi dalam tetapan aplikasi</string>
<string id="NoAPIKey" scope="glance">Tiada kunci API dalam tetapan aplikasi</string>
<string id="NoApiUrl" scope="glance">Tiada URL API dalam tetapan aplikasi</string>
<string id="NoConfigUrl" scope="glance">Tiada URL konfigurasi dalam tetapan aplikasi</string>
<string id="ApiFlood">Panggilan API terlalu pantas. Sila perlahankan permintaan anda.</string>
<string id="ApiUrlNotFound">URL tidak ditemui. Ralat URL API yang berpotensi dalam tetapan.</string>
<string id="ConfigUrlNotFound">URL tidak ditemui. Ralat URL Konfigurasi Potensi dalam tetapan.</string>
<string id="NoJson">Tiada JSON dikembalikan daripada permintaan HTTP.</string>
<string id="UnhandledHttpErr">Permintaan HTTP mengembalikan kod ralat =</string>
<string id="TrailingSlashErr">URL API tidak boleh mempunyai garis miring '/'</string>
<string id="FetchingMenuConfig">Mengambil Konfigurasi Menu..</string>
<string id="ExitViewTouch">Leret ke Kanan untuk Keluar\nKetik untuk Kekal</string>
<string id="ExitViewButtons">Tekan Kembali untuk Keluar\nMasuk untuk Kekal</string>
<string id="Available" scope="glance">Tersedia</string>
<string id="Checking" scope="glance">Menyemak...</string>
<string id="Unavailable" scope="glance">Tidak ada</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- Untuk GUI tetapan -->
<string id="SettingsApiKey">Kunci API untuk HomeAssistant.</string>
<string id="SettingsApiKeyPrompt">Token Akses Berumur Panjang.</string>

View File

@ -19,21 +19,22 @@
<string id="MenuItemTap">Tap</string>
<string id="MenuItemMenu">Menu</string>
<string id="Confirm">Sure?</string>
<string id="NoPhone">No Phone connection</string>
<string id="NoPhone" scope="glance">No Phone connection</string>
<string id="NoInternet">No Internet connection</string>
<string id="NoResponse">No Response, check Internet connection</string>
<string id="NoMenu">Menu Fetch Error</string>
<string id="NoAPIKey">No API key in the application settings</string>
<string id="NoApiUrl">No API URL in the application settings</string>
<string id="NoConfigUrl">No configuration URL in the application settings</string>
<string id="NoAPIKey" scope="glance">No API key in the application settings</string>
<string id="NoApiUrl" scope="glance">No API URL in the application settings</string>
<string id="NoConfigUrl" scope="glance">No configuration URL in the application settings</string>
<string id="ApiFlood">API calls too rapid. Please slow down your requests.</string>
<string id="ApiUrlNotFound">URL not found. Potential API URL error in settings.</string>
<string id="ConfigUrlNotFound">URL not found. Potential Configuration URL error in settings.</string>
<string id="NoJson">No JSON returned from HTTP request.</string>
<string id="UnhandledHttpErr">HTTP request returned error code = </string>
<string id="TrailingSlashErr">API URL must not have a trailing slash '/'</string>
<string id="FetchingMenuConfig">Fetching Menu Config..</string>
<string id="ExitViewTouch">Swipe to Right to Exit\nTap to Stay</string>
<string id="ExitViewButtons">Hit Back to Exit\nEnter to Stay</string>
<string id="Available" scope="glance">Available</string>
<string id="Checking" scope="glance">Checking...</string>
<string id="Unavailable" scope="glance">Unavailable</string>
<string id="GlanceMenu" scope="glance">Menu</string>
<!-- For the settings GUI -->
<string id="SettingsApiKey">API Key for HomeAssistant.</string>

View File

@ -106,10 +106,21 @@ class ErrorView extends ScalableView {
create(text); // Ignore returned values
if (!mShown) {
WatchUi.pushView(instance, instance.getDelegate(), WatchUi.SLIDE_UP);
// This must be last to avoid a race condition with unShow(), where the
// ErrorView can't be dismissed.
mShown = true;
}
}
static function unShow() as Void {
if (mShown) {
WatchUi.popView(WatchUi.SLIDE_DOWN);
// This must be last to avoid a race condition with show(), where the
// ErrorView can't be dismissed.
mShown = false;
}
}
// Internal show now we're not a static method like 'show()'.
function setText(text as Lang.String) as Void {
mText = text;
@ -119,13 +130,6 @@ class ErrorView extends ScalableView {
}
}
static function unShow() as Void {
if (mShown) {
mShown = false;
WatchUi.popView(WatchUi.SLIDE_DOWN);
}
}
}
class ErrorDelegate extends WatchUi.BehaviorDelegate {

View File

@ -26,4 +26,5 @@ class Globals {
static const scDebug = false;
static const scAlertTimeout = 2000; // ms
static const scTapTimeout = 1000; // ms
static const scApiBackoff = 1000; // ms
}

View File

@ -24,25 +24,32 @@ using Toybox.WatchUi;
using Toybox.Application.Properties;
class HomeAssistantApp extends Application.AppBase {
private var mHaMenu as HomeAssistantView or Null;
private var mQuitTimer as QuitTimer or Null;
private var strNoApiKey as Lang.String or Null;
private var strNoApiUrl as Lang.String or Null;
private var strNoConfigUrl as Lang.String or Null;
private var strNoPhone as Lang.String or Null;
private var strNoInternet as Lang.String or Null;
private var strNoResponse as Lang.String or Null;
private var strNoMenu as Lang.String or Null;
private var strApiFlood as Lang.String or Null;
private var strConfigUrlNotFound as Lang.String or Null;
private var strNoJson as Lang.String or Null;
private var strUnhandledHttpErr as Lang.String or Null;
private var strTrailingSlashErr as Lang.String or Null;
private var mItemsToUpdate; // Array initialised by onReturnFetchMenuConfig()
private var mNextItemToUpdate = 0; // Index into the above array
private var strAvailable = WatchUi.loadResource($.Rez.Strings.Available);
private var strUnavailable = WatchUi.loadResource($.Rez.Strings.Unavailable);
private var mApiKey as Lang.String;
private var mApiStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking);
private var mMenuStatus as Lang.String = WatchUi.loadResource($.Rez.Strings.Checking);
private var mHaMenu as HomeAssistantView or Null;
private var mQuitTimer as QuitTimer or Null;
private var mItemsToUpdate; // Array initialised by onReturnFetchMenuConfig()
private var mNextItemToUpdate = 0; // Index into the above array
private var mIsGlance as Lang.Boolean = false;
function initialize() {
AppBase.initialize();
mApiKey = Properties.getValue("api_key");
// ATTENTION when adding stuff into this block:
// Because of the >>GlanceView<<, it should contain only
// code, which is used as well for the glance:
@ -58,6 +65,7 @@ class HomeAssistantApp extends Application.AppBase {
// onStart() is called on application start up
function onStart(state as Lang.Dictionary?) as Void {
AppBase.onStart(state);
// ATTENTION when adding stuff into this block:
// Because of the >>GlanceView<<, it should contain only
// code, which is used as well for the glance:
@ -73,6 +81,7 @@ class HomeAssistantApp extends Application.AppBase {
// onStop() is called when your application is exiting
function onStop(state as Lang.Dictionary?) as Void {
AppBase.onStop(state);
// ATTENTION when adding stuff into this block:
// Because of the >>GlanceView<<, it should contain only
// code, which is used as well for the glance:
@ -88,16 +97,15 @@ class HomeAssistantApp extends Application.AppBase {
// Return the initial view of your application here
function getInitialView() as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>? {
strNoApiKey = WatchUi.loadResource($.Rez.Strings.NoAPIKey);
strNoApiUrl = WatchUi.loadResource($.Rez.Strings.NoApiUrl);
strNoConfigUrl = WatchUi.loadResource($.Rez.Strings.NoConfigUrl);
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
strNoMenu = WatchUi.loadResource($.Rez.Strings.NoMenu);
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
strConfigUrlNotFound = WatchUi.loadResource($.Rez.Strings.ConfigUrlNotFound);
strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
strTrailingSlashErr = WatchUi.loadResource($.Rez.Strings.TrailingSlashErr);
mQuitTimer = new QuitTimer();
@ -136,61 +144,102 @@ class HomeAssistantApp extends Application.AppBase {
return ErrorView.create(strNoInternet + ".");
} else {
fetchMenuConfig();
return [new RootView(self), new RootViewDelegate(self)] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
fetchApiStatus();
if (WidgetApp.isWidget) {
return [new RootView(self), new RootViewDelegate(self)] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
} else {
return [new WatchUi.View(), new WatchUi.BehaviorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
}
}
}
// Callback function after completing the GET request to fetch the configuration menu.
//
(:glance)
function onReturnFetchMenuConfig(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: " + responseCode);
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Data: " + data);
}
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
ErrorView.show(strNoPhone + ".");
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
// Don't need to worry about multiple ErrorViews here as the fetch does not happen a second time.
ErrorView.show(strApiFlood);
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
} else if (responseCode == 404) {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
}
ErrorView.show(strConfigUrlNotFound);
} else if (responseCode == 200) {
mHaMenu = new HomeAssistantView(data, null);
mQuitTimer.begin();
pushHomeAssistantMenuView();
mItemsToUpdate = mHaMenu.getItemsToUpdate();
// Start the continuous update process that continues for as long as the application is running.
// The chain of functions from 'updateNextMenuItem()' calls 'updateNextMenuItem()' on completion.
if (mItemsToUpdate.size() > 0) {
updateNextMenuItem();
}
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Network request timeout.");
}
ErrorView.show(strNoMenu + ". " + strNoInternet + "?");
} else {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Unhandled HTTP response code = " + responseCode);
}
ErrorView.show(strUnhandledHttpErr + responseCode );
mMenuStatus = strUnavailable;
switch (responseCode) {
case Communications.BLE_HOST_TIMEOUT:
case Communications.BLE_CONNECTION_UNAVAILABLE:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
if (!mIsGlance) {
ErrorView.show(strNoPhone + ".");
}
break;
case Communications.BLE_QUEUE_FULL:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
if (!mIsGlance) {
ErrorView.show(strApiFlood);
}
break;
case Communications.NETWORK_REQUEST_TIMED_OUT:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
if (!mIsGlance) {
ErrorView.show(strNoResponse);
}
break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
}
if (!mIsGlance) {
ErrorView.show(strNoJson);
}
break;
case 404:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig() Response Code: 404, page not found. Check Configuration URL setting.");
}
if (!mIsGlance) {
ErrorView.show(strConfigUrlNotFound);
}
break;
case 200:
mMenuStatus = strAvailable;
if (!mIsGlance) {
mHaMenu = new HomeAssistantView(data, null);
mQuitTimer.begin();
mItemsToUpdate = mHaMenu.getItemsToUpdate();
// Start the continuous update process that continues for as long as the application is running.
// The chain of functions from 'updateNextMenuItem()' calls 'updateNextMenuItem()' on completion.
if (mItemsToUpdate.size() > 0) {
updateNextMenuItem();
}
if (!WidgetApp.isWidget) {
WatchUi.switchToView(mHaMenu, new HomeAssistantViewDelegate(false), WatchUi.SLIDE_IMMEDIATE);
}
}
WatchUi.requestUpdate();
break;
default:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchMenuConfig(): Unhandled HTTP response code = " + responseCode);
}
if (!mIsGlance) {
ErrorView.show(strUnhandledHttpErr + responseCode);
}
break;
}
}
(:glance)
function fetchMenuConfig() as Void {
var options = {
:method => Communications.HTTP_REQUEST_METHOD_GET,
@ -204,11 +253,120 @@ class HomeAssistantApp extends Application.AppBase {
);
}
function homeAssistantMenuIsLoaded() as Lang.Boolean{
return mHaMenu!=null;
// Callback function after completing the GET request to fetch the API status.
//
(:glance)
function onReturnFetchApiStatus(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void {
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: " + responseCode);
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Data: " + data);
}
mApiStatus = strUnavailable;
switch (responseCode) {
case Communications.BLE_HOST_TIMEOUT:
case Communications.BLE_CONNECTION_UNAVAILABLE:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
if (!mIsGlance) {
ErrorView.show(strNoPhone + ".");
}
break;
case Communications.BLE_QUEUE_FULL:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
if (!mIsGlance) {
ErrorView.show(strApiFlood);
}
break;
case Communications.NETWORK_REQUEST_TIMED_OUT:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
if (!mIsGlance) {
ErrorView.show(strNoResponse);
}
break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
}
if (!mIsGlance) {
ErrorView.show(strNoJson);
}
break;
case 404:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus() Response Code: 404, page not found. Check Configuration URL setting.");
}
if (!mIsGlance) {
ErrorView.show(strConfigUrlNotFound);
}
break;
case 200:
var msg = null;
if (data != null) {
msg = data.get("message");
}
if (msg.equals("API running.")) {
mApiStatus = strAvailable;
} else {
if (!mIsGlance) {
ErrorView.show("API " + mApiStatus + ".");
}
}
WatchUi.requestUpdate();
break;
default:
if (Globals.scDebug) {
System.println("HomeAssistantApp onReturnFetchApiStatus(): Unhandled HTTP response code = " + responseCode);
}
if (!mIsGlance) {
ErrorView.show(strUnhandledHttpErr + responseCode);
}
}
}
function pushHomeAssistantMenuView() as Void{
(:glance)
function fetchApiStatus() as Void {
var options = {
:method => Communications.HTTP_REQUEST_METHOD_GET,
:headers => {
"Authorization" => "Bearer " + mApiKey
},
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
};
Communications.makeWebRequest(
Properties.getValue("api_url") + "/",
null,
options,
method(:onReturnFetchApiStatus)
);
}
(:glance)
function getApiStatus() as Lang.String {
return mApiStatus;
}
(:glance)
function getMenuStatus() as Lang.String {
return mMenuStatus;
}
function isHomeAssistantMenuLoaded() as Lang.Boolean {
return mHaMenu != null;
}
function pushHomeAssistantMenuView() as Void {
WatchUi.pushView(mHaMenu, new HomeAssistantViewDelegate(true), WatchUi.SLIDE_IMMEDIATE);
}
@ -220,13 +378,16 @@ class HomeAssistantApp extends Application.AppBase {
mNextItemToUpdate = (mNextItemToUpdate + 1) % itu.size();
}
function getQuitTimer() as QuitTimer{
function getQuitTimer() as QuitTimer {
return mQuitTimer;
}
(:glance)
function getGlanceView() {
return [new HomeAssistantGlanceView()];
mIsGlance = true;
fetchMenuConfig();
fetchApiStatus();
return [new HomeAssistantGlanceView(self)];
}
}

View File

@ -24,19 +24,86 @@ using Toybox.Graphics;
(:glance)
class HomeAssistantGlanceView extends WatchUi.GlanceView {
private static const scLeftMargin = 20; // in pixels
private static const scLeftIndent = 10; // Left Indent "_text:" in pixels
private static const scMidSep = 10; // Middle Separator "text:_text" in pixels
private var mApp as HomeAssistantApp;
private var mTitle as WatchUi.Text or Null;
private var mApiText as WatchUi.Text or Null;
private var mApiStatus as WatchUi.Text or Null;
private var mMenuText as WatchUi.Text or Null;
private var mMenuStatus as WatchUi.Text or Null;
private var mText as Lang.String;
function initialize() {
function initialize(app as HomeAssistantApp) {
GlanceView.initialize();
mApp = app;
}
mText = WatchUi.loadResource($.Rez.Strings.AppName);
function onLayout(dc as Graphics.Dc) as Void {
var strChecking = WatchUi.loadResource($.Rez.Strings.Checking);
var strGlanceMenu = WatchUi.loadResource($.Rez.Strings.GlanceMenu);
var h = dc.getHeight();
var tw = dc.getTextWidthInPixels(strGlanceMenu, Graphics.FONT_XTINY);
mTitle = new WatchUi.Text({
:text => WatchUi.loadResource($.Rez.Strings.AppName),
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_TINY,
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => scLeftMargin,
:locY => 1 * h / 6
});
mApiText = new WatchUi.Text({
:text => "API:",
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => scLeftMargin + scLeftIndent + tw,
:locY => 3 * h / 6
});
mApiStatus = new WatchUi.Text({
:text => strChecking,
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => scLeftMargin + scLeftIndent + scMidSep + tw,
:locY => 3 * h / 6
});
mMenuText = new WatchUi.Text({
:text => strGlanceMenu + ":",
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => scLeftMargin + scLeftIndent + tw,
:locY => 5 * h / 6
});
mMenuStatus = new WatchUi.Text({
:text => strChecking,
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => scLeftMargin + scLeftIndent + scMidSep + tw,
:locY => 5 * h / 6
});
}
function onUpdate(dc) as Void {
GlanceView.onUpdate(dc);
dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
dc.drawText(0, dc.getHeight() / 2, Graphics.FONT_TINY, mText, Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER);
if(dc has :setAntiAlias) {
dc.setAntiAlias(true);
}
dc.setColor(
Graphics.COLOR_WHITE,
Graphics.COLOR_BLUE
);
dc.clear();
mTitle.draw(dc);
mApiText.draw(dc);
mApiStatus.setText(mApp.getApiStatus());
mApiStatus.draw(dc);
mMenuText.draw(dc);
mMenuStatus.setText(mApp.getMenuStatus());
mMenuStatus.draw(dc);
}
}

View File

@ -24,22 +24,18 @@ using Toybox.Graphics;
using Toybox.Application.Properties;
class HomeAssistantService {
private var mApiKey as Lang.String;
private var strNoPhone as Lang.String;
private var strNoInternet as Lang.String;
private var strNoResponse as Lang.String;
private var strApiFlood as Lang.String;
private var strApiUrlNotFound as Lang.String;
private var strUnhandledHttpErr as Lang.String;
private var strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
private var strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
private var strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
private var strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
private var strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
private var strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
private var mApiKey as Lang.String;
function initialize() {
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
mApiKey = Properties.getValue("api_key");
mApiKey = Properties.getValue("api_key");
}
// Callback function after completing the POST request to call a service.
@ -50,54 +46,79 @@ class HomeAssistantService {
System.println("HomeAssistantService onReturnCall() Response Code: " + responseCode);
System.println("HomeAssistantService onReturnCall() Response Data: " + data);
}
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
ErrorView.show(strNoPhone + ".");
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
// Don't need to worry about multiple ErrorViews here as the call is not on a repeat timer.
ErrorView.show(strApiFlood);
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
} else if (responseCode == 404) {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: 404, page not found. Check API URL setting.");
}
ErrorView.show(strApiUrlNotFound);
} else if (responseCode == 200) {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall(): Service executed.");
}
var d = data as Lang.Array;
var toast = "Executed";
for(var i = 0; i < d.size(); i++) {
if ((d[i].get("entity_id") as Lang.String).equals(identifier)) {
toast = (d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String;
switch (responseCode) {
case Communications.BLE_HOST_TIMEOUT:
case Communications.BLE_CONNECTION_UNAVAILABLE:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
}
if (WatchUi has :showToast) {
WatchUi.showToast(toast, null);
} else {
new Alert({
:timeout => Globals.scAlertTimeout,
:font => Graphics.FONT_MEDIUM,
:text => toast,
:fgcolor => Graphics.COLOR_WHITE,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
}
} else {
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall(): Unhandled HTTP response code = " + responseCode);
}
ErrorView.show(strUnhandledHttpErr + responseCode );
ErrorView.show(strNoPhone + ".");
break;
case Communications.BLE_QUEUE_FULL:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
ErrorView.show(strApiFlood);
break;
case Communications.NETWORK_REQUEST_TIMED_OUT:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
break;
case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?");
}
// Ignore and see if we can carry on
break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
}
ErrorView.show(strNoJson);
break;
case 404:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall() Response Code: 404, page not found. Check API URL setting.");
}
ErrorView.show(strApiUrlNotFound);
break;
case 200:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall(): Service executed.");
}
var d = data as Lang.Array;
var toast = "Executed";
for(var i = 0; i < d.size(); i++) {
if ((d[i].get("entity_id") as Lang.String).equals(identifier)) {
toast = (d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String;
}
}
if (WatchUi has :showToast) {
WatchUi.showToast(toast, null);
} else {
new Alert({
:timeout => Globals.scAlertTimeout,
:font => Graphics.FONT_MEDIUM,
:text => toast,
:fgcolor => Graphics.COLOR_WHITE,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
}
break;
default:
if (Globals.scDebug) {
System.println("HomeAssistantService onReturnCall(): Unhandled HTTP response code = " + responseCode);
}
ErrorView.show(strUnhandledHttpErr + responseCode);
}
}

View File

@ -25,13 +25,15 @@ using Toybox.Application.Properties;
using Toybox.Timer;
class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
private var mApiKey as Lang.String;
private var strNoPhone as Lang.String;
private var strNoInternet as Lang.String;
private var strNoResponse as Lang.String;
private var strApiFlood as Lang.String;
private var strApiUrlNotFound as Lang.String;
private var strUnhandledHttpErr as Lang.String;
private var strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
private var strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
private var strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
private var strNoJson = WatchUi.loadResource($.Rez.Strings.NoJson);
private var strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
private var strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
private var strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
private var mApiKey as Lang.String;
function initialize(
label as Lang.String or Lang.Symbol,
@ -46,13 +48,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
:icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol
} or Null
) {
strNoPhone = WatchUi.loadResource($.Rez.Strings.NoPhone);
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
strNoResponse = WatchUi.loadResource($.Rez.Strings.NoResponse);
strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood);
strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound);
strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr);
mApiKey = Properties.getValue("api_key");
mApiKey = Properties.getValue("api_key");
WatchUi.ToggleMenuItem.initialize(label, subLabel, identifier, enabled, options);
}
@ -75,6 +71,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: " + responseCode);
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Data: " + data);
}
// Provide the ability to terminate updating chain of calls for a permanent network error.
var keepUpdating = true;
switch (responseCode) {
@ -85,29 +82,50 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
}
ErrorView.show(strNoPhone + ".");
break;
case Communications.BLE_QUEUE_FULL:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
ErrorView.show(strApiFlood);
break;
case Communications.NETWORK_REQUEST_TIMED_OUT:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
}
ErrorView.show(strNoJson);
break;
case Communications.NETWORK_RESPONSE_OUT_OF_MEMORY:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: NETWORK_RESPONSE_OUT_OF_MEMORY, are we going too fast?");
}
// Pause updates
keepUpdating = false;
var myTimer = new Timer.Timer();
// Now this feels very "closely coupled" to the application, but it is the most reliable method instead of using a timer.
myTimer.start(getApp().method(:updateNextMenuItem), Globals.scApiBackoff, false);
break;
case 404:
var msg = null;
if (data != null) {
msg = data.get("message");
}
if (msg != null) {
// Should be an HTTP 405 according to curl queries
// Should be an HTTP 404 according to curl queries
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404. " + mIdentifier + " " + msg);
}
ErrorView.show("HTTP 405, " + mIdentifier + ". " + data.get("message"));
ErrorView.show("HTTP 404, " + mIdentifier + ". " + data.get("message"));
} else {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 404, page not found. Check API URL setting.");
@ -116,6 +134,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
}
keepUpdating = false;
break;
case 405:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState() Response Code: 405. " + mIdentifier + " " + data.get("message"));
@ -123,6 +142,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
ErrorView.show("HTTP 405, " + mIdentifier + ". " + data.get("message"));
keepUpdating = false;
break;
case 200:
var state = data.get("state") as Lang.String;
if (Globals.scDebug) {
@ -134,6 +154,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
setUiToggle(state);
ErrorView.unShow();
break;
default:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnGetState(): Unhandled HTTP response code = " + responseCode);
@ -199,43 +220,63 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: " + responseCode);
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Data: " + data);
}
if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
ErrorView.show(strNoPhone + ".");
} else if (responseCode == Communications.BLE_QUEUE_FULL) {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
ErrorView.show(strApiFlood);
} else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
} else if (responseCode == 404) {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: 404, page not found. Check API URL setting.");
}
ErrorView.show(strApiUrlNotFound);
} else if (responseCode == 200) {
var state;
var d = data as Lang.Array;
for(var i = 0; i < d.size(); i++) {
if ((d[i].get("entity_id") as Lang.String).equals(mIdentifier)) {
state = d[i].get("state") as Lang.String;
if (Globals.scDebug) {
System.println((d[i].get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
}
setUiToggle(state);
switch (responseCode) {
case Communications.BLE_HOST_TIMEOUT:
case Communications.BLE_CONNECTION_UNAVAILABLE:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed.");
}
}
} else {
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState(): Unhandled HTTP response code = " + responseCode);
}
ErrorView.show(strUnhandledHttpErr + responseCode );
ErrorView.show(strNoPhone + ".");
break;
case Communications.BLE_QUEUE_FULL:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: BLE_QUEUE_FULL, API calls too rapid.");
}
ErrorView.show(strApiFlood);
break;
case Communications.NETWORK_REQUEST_TIMED_OUT:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection.");
}
ErrorView.show(strNoResponse);
break;
case Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: INVALID_HTTP_BODY_IN_NETWORK_RESPONSE, check JSON is returned.");
}
ErrorView.show(strNoJson);
break;
case 404:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState() Response Code: 404, page not found. Check API URL setting.");
}
ErrorView.show(strApiUrlNotFound);
break;
case 200:
var state;
var d = data as Lang.Array;
for(var i = 0; i < d.size(); i++) {
if ((d[i].get("entity_id") as Lang.String).equals(mIdentifier)) {
state = d[i].get("state") as Lang.String;
if (Globals.scDebug) {
System.println((d[i].get("attributes") as Lang.Dictionary).get("friendly_name") + " State=" + state);
}
setUiToggle(state);
}
}
break;
default:
if (Globals.scDebug) {
System.println("HomeAssistantToggleMenuItem onReturnSetState(): Unhandled HTTP response code = " + responseCode);
}
ErrorView.show(strUnhandledHttpErr + responseCode);
}
}

View File

@ -103,20 +103,21 @@ class HomeAssistantView extends WatchUi.Menu2 {
// Reference: https://developer.garmin.com/connect-iq/core-topics/input-handling/
//
class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate {
private var mIsRootMenuView = false;
private var mIsRootMenuView as Lang.Boolean = false;
private var mTimer as QuitTimer;
function initialize(isRootMenuView as Lang.Boolean) {
Menu2InputDelegate.initialize();
mIsRootMenuView = isRootMenuView;
mTimer = getApp().getQuitTimer();
}
function onBack() {
getApp().getQuitTimer().reset();
mTimer.reset();
if (mIsRootMenuView){
if (mIsRootMenuView) {
// If its started from glance or as an activity, directly exit the widget/app
// (on widgets without glance, this exit() won`t do anything,
// (on widgets without glance, this exit() won't do anything,
// so the base view will be shown instead, through the popView below this "if body")
System.exit();
}
@ -126,16 +127,16 @@ class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate {
// Only for CheckboxMenu
function onDone() {
getApp().getQuitTimer().reset();
mTimer.reset();
}
// Only for CustomMenu
function onFooter() {
getApp().getQuitTimer().reset();
mTimer.reset();
}
function onSelect(item as WatchUi.MenuItem) as Void {
getApp().getQuitTimer().reset();
mTimer.reset();
if (item instanceof HomeAssistantToggleMenuItem) {
var haToggleItem = item as HomeAssistantToggleMenuItem;
if (Globals.scDebug) {
@ -175,7 +176,7 @@ class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate {
// Only for CustomMenu
function onTitle() {
getApp().getQuitTimer().reset();
mTimer.reset();
}
}

View File

@ -37,64 +37,87 @@ class RootView extends ScalableView {
// terminated automatically by OS after some time or can be quit manually, when on the base
// view a swipe to left / "back button" press is done.
private var mApp as HomeAssistantApp;
private var strFetchingMenuConfig as Lang.String;
private var strExit as Lang.String;
private var mTextAreaExit as WatchUi.TextArea or Null;
private var mTextAreaFetching as WatchUi.TextArea or Null;
private static const scMidSep = 10; // Middle Separator "text:_text" in pixels
private var mApp as HomeAssistantApp;
private var mTitle as WatchUi.Text or Null;
private var mApiText as WatchUi.Text or Null;
private var mApiStatus as WatchUi.Text or Null;
private var mMenuText as WatchUi.Text or Null;
private var mMenuStatus as WatchUi.Text or Null;
function initialize(app as HomeAssistantApp) {
ScalableView.initialize();
mApp=app;
strFetchingMenuConfig = WatchUi.loadResource($.Rez.Strings.FetchingMenuConfig);
if (System.getDeviceSettings().isTouchScreen){
strExit = WatchUi.loadResource($.Rez.Strings.ExitViewTouch);
} else {
strExit = WatchUi.loadResource($.Rez.Strings.ExitViewButtons);
}
mApp = app;
}
function onLayout(dc as Graphics.Dc) as Void {
var w = dc.getWidth();
var h = dc.getHeight();
var strChecking = WatchUi.loadResource($.Rez.Strings.Checking);
var w = dc.getWidth();
mTextAreaExit = new WatchUi.TextArea({
:text => strExit,
mTitle = new WatchUi.Text({
:text => WatchUi.loadResource($.Rez.Strings.AppName),
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:font => Graphics.FONT_TINY,
:justification => Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => 0,
:locY => 83,
:width => w,
:height => h - 166
:locX => w/2,
:locY => pixelsForScreen(30.0)
});
mTextAreaFetching = new WatchUi.TextArea({
:text => strFetchingMenuConfig,
mApiText = new WatchUi.Text({
:text => "API:",
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => 0,
:locY => 83,
:width => w,
:height => h - 166
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => w/2 - scMidSep/2,
:locY => pixelsForScreen(50.0)
});
mApiStatus = new WatchUi.Text({
:text => strChecking,
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => w/2 + scMidSep/2,
:locY => pixelsForScreen(50.0)
});
mMenuText = new WatchUi.Text({
:text => WatchUi.loadResource($.Rez.Strings.GlanceMenu) + ":",
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_RIGHT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => w/2 - scMidSep/2,
:locY => pixelsForScreen(70.0)
});
mMenuStatus = new WatchUi.Text({
:text => strChecking,
:color => Graphics.COLOR_WHITE,
:font => Graphics.FONT_XTINY,
:justification => Graphics.TEXT_JUSTIFY_LEFT | Graphics.TEXT_JUSTIFY_VCENTER,
:locX => w/2 + scMidSep/2,
:locY => pixelsForScreen(70.0)
});
}
function onUpdate(dc as Graphics.Dc) as Void {
if(dc has :setAntiAlias) {
if (dc has :setAntiAlias) {
dc.setAntiAlias(true);
}
dc.setColor(Graphics.COLOR_WHITE, Graphics.COLOR_BLACK);
dc.clear();
if(mApp.homeAssistantMenuIsLoaded()) {
mTextAreaExit.draw(dc);
} else {
mTextAreaFetching.draw(dc);
}
// Initialise this locally, otherwise the venu1 device runs out of memory when stored at class level.
var launcherIcon = Application.loadResource(Rez.Drawables.LauncherIcon);
var w = dc.getWidth();
var h = dc.getHeight();
dc.drawBitmap(w/2 - launcherIcon.getWidth()/2, h/8 - launcherIcon.getHeight()/2, launcherIcon);
mTitle.draw(dc);
mApiText.draw(dc);
mApiStatus.setText(mApp.getApiStatus());
mApiStatus.draw(dc);
mMenuText.draw(dc);
mMenuStatus.setText(mApp.getMenuStatus());
mMenuStatus.draw(dc);
}
}
@ -102,9 +125,9 @@ class RootViewDelegate extends WatchUi.BehaviorDelegate {
var mApp as HomeAssistantApp;
function initialize(app as HomeAssistantApp ) {
function initialize(app as HomeAssistantApp) {
BehaviorDelegate.initialize();
mApp=app;
mApp = app;
}
function onTap(evt as WatchUi.ClickEvent) as Lang.Boolean {
@ -115,12 +138,12 @@ class RootViewDelegate extends WatchUi.BehaviorDelegate {
return backToMainMenu();
}
function onMenu() as Lang.Boolean{
function onMenu() as Lang.Boolean {
return backToMainMenu();
}
private function backToMainMenu() as Lang.Boolean{
if(mApp.homeAssistantMenuIsLoaded()){
private function backToMainMenu() as Lang.Boolean {
if (mApp.isHomeAssistantMenuLoaded()) {
mApp.pushHomeAssistantMenuView();
return true;
}

View File

@ -27,6 +27,7 @@ class ScalableView extends WatchUi.View {
function initialize() {
View.initialize();
mScreenWidth = System.getDeviceSettings().screenWidth;
}
// Convert a fraction expressed as a percentage (%) to a number of pixels for the
@ -40,9 +41,6 @@ class ScalableView extends WatchUi.View {
// height > width.
//
function pixelsForScreen(pc as Lang.Float) as Lang.Number {
if (mScreenWidth == null) {
mScreenWidth = System.getDeviceSettings().screenWidth;
}
return Math.round(pc * mScreenWidth) / 100;
}
}