Added 54 devices

Added vibrate knowledgement
Fall back to a home made alert if no toast or vibrate
Support for 80 devices, 54 new ones added
This commit is contained in:
Philip Abbey
2023-11-10 18:22:14 +00:00
parent 3c0b39ad3e
commit 1653569e8f
61 changed files with 578 additions and 74 deletions

View File

@ -23,7 +23,7 @@ using Toybox.Lang;
class Globals {
// Enable printing of messages to the debug console (don't make this a Property
// as the messages can't be read from a watch!)
static const debug = false;
static const debug = true;
static const updateInterval = 5; // seconds
static const alertTimeout = 2000; // ms
static const tapTimeout = 1000; // ms

View File

@ -26,20 +26,25 @@ using Toybox.Timer;
class HomeAssistantApp extends Application.AppBase {
hidden var haMenu;
hidden var strNoInternet as Lang.String;
hidden var strNoMenu as Lang.String;
hidden var timer as Timer.Timer;
hidden var strNoApiKey as Lang.String;
hidden var strNoApiUrl as Lang.String;
hidden var strNoConfigUrl as Lang.String;
hidden var strNoInternet as Lang.String;
hidden var strNoMenu as Lang.String;
hidden var timer as Timer.Timer;
function initialize() {
AppBase.initialize();
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
strNoMenu = WatchUi.loadResource($.Rez.Strings.NoMenu);
timer = new Timer.Timer();
strNoApiKey = WatchUi.loadResource($.Rez.Strings.NoAPIKey);
strNoApiUrl = WatchUi.loadResource($.Rez.Strings.NoApiUrl);
strNoConfigUrl = WatchUi.loadResource($.Rez.Strings.NoConfigUrl);
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
strNoMenu = WatchUi.loadResource($.Rez.Strings.NoMenu);
timer = new Timer.Timer();
}
// onStart() is called on application start up
function onStart(state as Lang.Dictionary?) as Void {
fetchMenuConfig();
}
// onStop() is called when your application is exiting
@ -51,7 +56,30 @@ class HomeAssistantApp extends Application.AppBase {
// Return the initial view of your application here
function getInitialView() as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>? {
return [new WatchUi.View(), new WatchUi.BehaviorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
if ((Properties.getValue("api_key") as Lang.String).length() == 0) {
if (Globals.debug) {
System.println("HomeAssistantMenuItem Note - execScript(): No API key in the application settings.");
}
return [new ErrorView(strNoApiKey + "."), new ErrorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
} else if ((Properties.getValue("api_url") as Lang.String).length() == 0) {
if (Globals.debug) {
System.println("HomeAssistantMenuItem Note - execScript(): No API URL in the application settings.");
}
return [new ErrorView(strNoApiUrl + "."), new ErrorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
} else if ((Properties.getValue("config_url") as Lang.String).length() == 0) {
if (Globals.debug) {
System.println("HomeAssistantMenuItem Note - execScript(): No configuration URL in the application settings.");
}
return [new ErrorView(strNoConfigUrl + "."), new ErrorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
} else if (System.getDeviceSettings().phoneConnected && System.getDeviceSettings().connectionAvailable) {
fetchMenuConfig();
return [new WatchUi.View(), new WatchUi.BehaviorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
} else {
if (Globals.debug) {
System.println("HomeAssistantApp Note - fetchMenuConfig(): No Internet connection, skipping API call.");
}
return [new ErrorView(strNoInternet + "."), new ErrorDelegate()] as Lang.Array<WatchUi.Views or WatchUi.InputDelegates>;
}
}
// Callback function after completing the GET request to fetch the configuration menu.
@ -87,25 +115,12 @@ class HomeAssistantApp extends Application.AppBase {
:method => Communications.HTTP_REQUEST_METHOD_GET,
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
};
if (System.getDeviceSettings().phoneConnected && System.getDeviceSettings().connectionAvailable) {
Communications.makeWebRequest(
Properties.getValue("config_url"),
null,
options,
method(:onReturnFetchMenuConfig)
);
} else {
if (Globals.debug) {
System.println("HomeAssistantApp Note - fetchMenuConfig(): No Internet connection, skipping API call.");
}
new Alert({
:timeout => Globals.alertTimeout,
:font => Graphics.FONT_SYSTEM_TINY,
:text => strNoInternet,
:fgcolor => Graphics.COLOR_RED,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
}
Communications.makeWebRequest(
Properties.getValue("config_url"),
null,
options,
method(:onReturnFetchMenuConfig)
);
}
}

View File

@ -37,6 +37,7 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem {
} or Null
) {
strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet);
WatchUi.MenuItem.initialize(
label,
subLabel,
@ -59,10 +60,28 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem {
if (Globals.debug) {
System.println("HomeAssistantMenuItem Note - onReturnExecScript(): Correct script executed.");
}
WatchUi.showToast(
(d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String,
null
);
if (WatchUi has :showToast) {
WatchUi.showToast(
(d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String,
null
);
}
if (Attention has :vibrate) {
Attention.vibrate([
new Attention.VibeProfile(50, 100), // On for 100ms
new Attention.VibeProfile( 0, 100), // Off for 100ms
new Attention.VibeProfile(50, 100) // On for 100ms
]);
}
if (!(WatchUi has :showToast) && !(Attention has :vibrate)) {
new Alert({
:timeout => Globals.alertTimeout,
:font => Graphics.FONT_MEDIUM,
:text => (d[i].get("attributes") as Lang.Dictionary).get("friendly_name") as Lang.String,
:fgcolor => Graphics.COLOR_WHITE,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
}
}
}
}
@ -77,10 +96,13 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem {
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
};
if (System.getDeviceSettings().phoneConnected && System.getDeviceSettings().connectionAvailable) {
var url = Properties.getValue("api_url") + "/services/" + mIdentifier.substring(0, mIdentifier.find(".")) + "/" + mIdentifier.substring(mIdentifier.find(".")+1, null);
// Updated SDK and got a new error
// ERROR: venu: Cannot find symbol ':substring' on type 'PolyType<Null or $.Toybox.Lang.Object>'.
var id = mIdentifier as Lang.String;
var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + id.substring(0, id.find(".")) + "/" + id.substring(id.find(".")+1, id.length());
if (Globals.debug) {
System.println("URL=" + url);
System.println("mIdentifier=" + mIdentifier);
System.println("HomeAssistantMenuItem execScript() URL=" + url);
System.println("HomeAssistantMenuItem execScript() mIdentifier=" + mIdentifier);
}
Communications.makeWebRequest(
url,
@ -90,15 +112,9 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem {
);
} else {
if (Globals.debug) {
System.println("HomeAssistantMenuItem Note - executeScript(): No Internet connection, skipping API call.");
System.println("HomeAssistantMenuItem Note - execScript(): No Internet connection, skipping API call.");
}
new Alert({
:timeout => Globals.alertTimeout,
:font => Graphics.FONT_SYSTEM_TINY,
:text => strNoInternet,
:fgcolor => Graphics.COLOR_RED,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP);
}
}

View File

@ -87,7 +87,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
if (System.getDeviceSettings().phoneConnected && System.getDeviceSettings().connectionAvailable) {
var url = Properties.getValue("api_url") + "/states/" + mIdentifier;
if (Globals.debug) {
System.println("URL=" + url);
System.println("HomeAssistantToggleMenuItem getState() URL=" + url);
}
Communications.makeWebRequest(
url,
@ -99,13 +99,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
if (Globals.debug) {
System.println("HomeAssistantToggleMenuItem Note - getState(): No Internet connection, skipping API call.");
}
new Alert({
:timeout => Globals.alertTimeout,
:font => Graphics.FONT_SYSTEM_TINY,
:text => strNoInternet,
:fgcolor => Graphics.COLOR_RED,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP);
}
}
@ -141,15 +135,18 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON
};
if (System.getDeviceSettings().phoneConnected && System.getDeviceSettings().connectionAvailable) {
// Updated SDK and got a new error
// ERROR: venu: Cannot find symbol ':substring' on type 'PolyType<Null or $.Toybox.Lang.Object>'.
var id = mIdentifier as Lang.String;
var url;
if (s) {
url = Properties.getValue("api_url") + "/services/" + mIdentifier.substring(0, mIdentifier.find(".")) + "/turn_on";
url = Properties.getValue("api_url") + "/services/" + id.substring(0, id.find(".")) + "/turn_on";
} else {
url = Properties.getValue("api_url") + "/services/" + mIdentifier.substring(0, mIdentifier.find(".")) + "/turn_off";
url = Properties.getValue("api_url") + "/services/" + id.substring(0, id.find(".")) + "/turn_off";
}
if (Globals.debug) {
System.println("URL=" + url);
System.println("mIdentifier=" + mIdentifier);
System.println("HomeAssistantToggleMenuItem setState() URL=" + url);
System.println("HomeAssistantToggleMenuItem setState() mIdentifier=" + mIdentifier);
}
Communications.makeWebRequest(
url,
@ -163,13 +160,7 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
if (Globals.debug) {
System.println("HomeAssistantToggleMenuItem Note - setState(): No Internet connection, skipping API call.");
}
new Alert({
:timeout => Globals.alertTimeout,
:font => Graphics.FONT_SYSTEM_TINY,
:text => strNoInternet,
:fgcolor => Graphics.COLOR_RED,
:bgcolor => Graphics.COLOR_BLACK
}).pushView(WatchUi.SLIDE_IMMEDIATE);
WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP);
}
}