From ab995db5baff71e6482f1eda33b4af45ca70ea09 Mon Sep 17 00:00:00 2001 From: SomeoneOnEarth Date: Sun, 19 Nov 2023 01:32:25 +0100 Subject: [PATCH] Removed redundant code from spike --- source/HomeAssistantIconMenuItem.mc | 122 +------------------- source/HomeAssistantMenuItem.mc | 139 +--------------------- source/HomeAssistantService.mc | 172 ++++++++++++++++++++++++++++ source/HomeAssistantView.mc | 4 +- 4 files changed, 185 insertions(+), 252 deletions(-) create mode 100644 source/HomeAssistantService.mc diff --git a/source/HomeAssistantIconMenuItem.mc b/source/HomeAssistantIconMenuItem.mc index 853cd1b..2e74d06 100644 --- a/source/HomeAssistantIconMenuItem.mc +++ b/source/HomeAssistantIconMenuItem.mc @@ -24,12 +24,7 @@ using Toybox.Graphics; using Toybox.Application.Properties; class HomeAssistantIconMenuItem extends WatchUi.IconMenuItem { - hidden var mApiKey as Lang.String; - hidden var strNoInternet as Lang.String; - hidden var strApiFlood as Lang.String; - hidden var strApiUrlNotFound as Lang.String; - hidden var strUnhandledHttpErr as Lang.String; - hidden var mService as Lang.String; + hidden var mHomeAssistantService as HomeAssistantService; function initialize( label as Lang.String or Lang.Symbol, @@ -41,12 +36,6 @@ class HomeAssistantIconMenuItem extends WatchUi.IconMenuItem { :alignment as WatchUi.MenuItem.Alignment } or Null ) { - strNoInternet = WatchUi.loadResource($.Rez.Strings.NoInternet); - strApiFlood = WatchUi.loadResource($.Rez.Strings.ApiFlood); - strApiUrlNotFound = WatchUi.loadResource($.Rez.Strings.ApiUrlNotFound); - strUnhandledHttpErr = WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr); - mApiKey = Properties.getValue("api_key"); - mService = service; WatchUi.IconMenuItem.initialize( label, subLabel, @@ -54,112 +43,13 @@ class HomeAssistantIconMenuItem extends WatchUi.IconMenuItem { icon, options ); + + mHomeAssistantService = new HomeAssistantService(service, identifier); + } - // Callback function after completing the POST request to call a script. - // - function onReturnExecScript(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem onReturnExecScript() Response Code: " + responseCode); - System.println("HomeAssistantIconMenuItem onReturnExecScript() Response Data: " + data); - } - if (responseCode == Communications.BLE_QUEUE_FULL) { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem onReturnExecScript() Response Code: BLE_QUEUE_FULL, API calls too rapid."); - } - var cw = WatchUi.getCurrentView(); - if (!(cw[0] instanceof ErrorView)) { - // Avoid pushing multiple ErrorViews - WatchUi.pushView(new ErrorView(strApiFlood), new ErrorDelegate(), WatchUi.SLIDE_UP); - } - } else if (responseCode == 404) { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem onReturnExecScript() Response Code: 404, page not found. Check API URL setting."); - } - WatchUi.pushView(new ErrorView(strApiUrlNotFound), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else if (responseCode == 200) { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem onReturnExecScript(): 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(mIdentifier)) { - 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); - } - } else { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem onReturnExecScript(): Unhandled HTTP response code = " + responseCode); - } - WatchUi.pushView(new ErrorView(strUnhandledHttpErr + responseCode ), new ErrorDelegate(), WatchUi.SLIDE_UP); - } - } - - function execScript() as Void { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_POST, - :headers => { - "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, - "Authorization" => "Bearer " + mApiKey - }, - :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'. - var id = mIdentifier as Lang.String; - if (mService == null) { - var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + id.substring(0, id.find(".")) + "/" + id.substring(id.find(".")+1, null); - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem execScript() URL=" + url); - System.println("HomeAssistantIconMenuItem execScript() mIdentifier=" + mIdentifier); - } - Communications.makeWebRequest( - url, - null, - options, - method(:onReturnExecScript) - ); - } else { - var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + mService.substring(0, mService.find(".")) + "/" + mService.substring(mService.find(".")+1, null); - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem execScript() URL=" + url); - System.println("HomeAssistantIconMenuItem execScript() mService=" + mService); - } - Communications.makeWebRequest( - url, - { - "entity_id" => id - }, - options, - method(:onReturnExecScript) - ); - } - 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 - ]); - } - } else { - if (Globals.scDebug) { - System.println("HomeAssistantIconMenuItem execScript(): No Internet connection, skipping API call."); - } - WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); - } + function callService() as Void { + mHomeAssistantService.call(); } } diff --git a/source/HomeAssistantMenuItem.mc b/source/HomeAssistantMenuItem.mc index ddb3d63..64c39ed 100644 --- a/source/HomeAssistantMenuItem.mc +++ b/source/HomeAssistantMenuItem.mc @@ -24,14 +24,7 @@ using Toybox.Graphics; using Toybox.Application.Properties; class HomeAssistantMenuItem extends WatchUi.MenuItem { - hidden var mApiKey as Lang.String; - hidden var strNoPhone as Lang.String; - hidden var strNoInternet as Lang.String; - hidden var strNoResponse as Lang.String; - hidden var strApiFlood as Lang.String; - hidden var strApiUrlNotFound as Lang.String; - hidden var strUnhandledHttpErr as Lang.String; - hidden var mService as Lang.String; + hidden var mHomeAssistantService as HomeAssistantService; function initialize( label as Lang.String or Lang.Symbol, @@ -43,140 +36,18 @@ class HomeAssistantMenuItem extends WatchUi.MenuItem { :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"); - mService = service; WatchUi.MenuItem.initialize( label, subLabel, identifier, options ); + + mHomeAssistantService = new HomeAssistantService(service, identifier); } - // Callback function after completing the POST request to call a script. - // - function onReturnExecScript(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript() Response Code: " + responseCode); - System.println("HomeAssistantMenuItem onReturnExecScript() Response Data: " + data); - } - if (responseCode == Communications.BLE_HOST_TIMEOUT || responseCode == Communications.BLE_CONNECTION_UNAVAILABLE) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript() Response Code: BLE_HOST_TIMEOUT or BLE_CONNECTION_UNAVAILABLE, Bluetooth connection severed."); - } - WatchUi.pushView(new ErrorView(strNoPhone + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else if (responseCode == Communications.BLE_QUEUE_FULL) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript() Response Code: BLE_QUEUE_FULL, API calls too rapid."); - } - if (!(WatchUi.getCurrentView()[0] instanceof ErrorView)) { - // Avoid pushing multiple ErrorViews - WatchUi.pushView(new ErrorView(strApiFlood), new ErrorDelegate(), WatchUi.SLIDE_UP); - } - } else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection."); - } - WatchUi.pushView(new ErrorView(strNoResponse), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else if (responseCode == 404) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript() Response Code: 404, page not found. Check API URL setting."); - } - WatchUi.pushView(new ErrorView(strApiUrlNotFound), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else if (responseCode == 200) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript(): 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(mIdentifier)) { - 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); - } - } else { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem onReturnExecScript(): Unhandled HTTP response code = " + responseCode); - } - WatchUi.pushView(new ErrorView(strUnhandledHttpErr + responseCode ), new ErrorDelegate(), WatchUi.SLIDE_UP); - } - } - - function execScript() as Void { - var options = { - :method => Communications.HTTP_REQUEST_METHOD_POST, - :headers => { - "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, - "Authorization" => "Bearer " + mApiKey - }, - :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON - }; - if (! System.getDeviceSettings().phoneConnected) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem execScript(): No Phone connection, skipping API call."); - } - WatchUi.pushView(new ErrorView(strNoPhone + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else if (! System.getDeviceSettings().connectionAvailable) { - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem execScript(): No Internet connection, skipping API call."); - } - WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); - } else { - // Updated SDK and got a new error - // ERROR: venu: Cannot find symbol ':substring' on type 'PolyType'. - var id = mIdentifier as Lang.String; - if (mService == null) { - var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + id.substring(0, id.find(".")) + "/" + id.substring(id.find(".")+1, null); - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem execScript() URL=" + url); - System.println("HomeAssistantMenuItem execScript() mIdentifier=" + mIdentifier); - } - Communications.makeWebRequest( - url, - null, - options, - method(:onReturnExecScript) - ); - } else { - var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + mService.substring(0, mService.find(".")) + "/" + mService.substring(mService.find(".")+1, null); - if (Globals.scDebug) { - System.println("HomeAssistantMenuItem execScript() URL=" + url); - System.println("HomeAssistantMenuItem execScript() mService=" + mService); - } - Communications.makeWebRequest( - url, - { - "entity_id" => id - }, - options, - method(:onReturnExecScript) - ); - } - 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 - ]); - } - } + function callService() as Void { + mHomeAssistantService.call(); } } diff --git a/source/HomeAssistantService.mc b/source/HomeAssistantService.mc new file mode 100644 index 0000000..20999d2 --- /dev/null +++ b/source/HomeAssistantService.mc @@ -0,0 +1,172 @@ +//----------------------------------------------------------------------------------- +// +// 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 & SomeoneOnEarth, 19 November 2023 +// +// +// Description: +// +// Calling a Home Assistant Service. +// +//----------------------------------------------------------------------------------- + +using Toybox.Lang; +using Toybox.WatchUi; +using Toybox.Graphics; +using Toybox.Application.Properties; + +class HomeAssistantService{ + hidden var mApiKey as Lang.String; + hidden var strNoPhone as Lang.String; + hidden var strNoInternet as Lang.String; + hidden var strNoResponse as Lang.String; + hidden var strApiFlood as Lang.String; + hidden var strApiUrlNotFound as Lang.String; + hidden var strUnhandledHttpErr as Lang.String; + hidden var mService as Lang.String; + hidden var mIdentifier as Lang.Object; + + function initialize( + service as Lang.String or Null, + identifier as Lang.Object 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"); + mService = service; + mIdentifier = identifier; + } + + // Callback function after completing the POST request to call a service. + // + function onReturnCall(responseCode as Lang.Number, data as Null or Lang.Dictionary or Lang.String) as Void { + if (Globals.scDebug) { + 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."); + } + WatchUi.pushView(new ErrorView(strNoPhone + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); + } else if (responseCode == Communications.BLE_QUEUE_FULL) { + if (Globals.scDebug) { + System.println("HomeAssistantService onReturnCall() Response Code: BLE_QUEUE_FULL, API calls too rapid."); + } + if (!(WatchUi.getCurrentView()[0] instanceof ErrorView)) { + // Avoid pushing multiple ErrorViews + WatchUi.pushView(new ErrorView(strApiFlood), new ErrorDelegate(), WatchUi.SLIDE_UP); + } + } else if (responseCode == Communications.NETWORK_REQUEST_TIMED_OUT) { + if (Globals.scDebug) { + System.println("HomeAssistantService onReturnCall() Response Code: NETWORK_REQUEST_TIMED_OUT, check Internet connection."); + } + WatchUi.pushView(new ErrorView(strNoResponse), new ErrorDelegate(), WatchUi.SLIDE_UP); + } else if (responseCode == 404) { + if (Globals.scDebug) { + System.println("HomeAssistantService onReturnCall() Response Code: 404, page not found. Check API URL setting."); + } + WatchUi.pushView(new ErrorView(strApiUrlNotFound), new ErrorDelegate(), WatchUi.SLIDE_UP); + } 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(mIdentifier)) { + 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); + } + } else { + if (Globals.scDebug) { + System.println("HomeAssistantService onReturnCall(): Unhandled HTTP response code = " + responseCode); + } + WatchUi.pushView(new ErrorView(strUnhandledHttpErr + responseCode ), new ErrorDelegate(), WatchUi.SLIDE_UP); + } + } + + function call() as Void { + var options = { + :method => Communications.HTTP_REQUEST_METHOD_POST, + :headers => { + "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON, + "Authorization" => "Bearer " + mApiKey + }, + :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON + }; + if (! System.getDeviceSettings().phoneConnected) { + if (Globals.scDebug) { + System.println("HomeAssistantService call(): No Phone connection, skipping API call."); + } + WatchUi.pushView(new ErrorView(strNoPhone + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); + } else if (! System.getDeviceSettings().connectionAvailable) { + if (Globals.scDebug) { + System.println("HomeAssistantService call(): No Internet connection, skipping API call."); + } + WatchUi.pushView(new ErrorView(strNoInternet + "."), new ErrorDelegate(), WatchUi.SLIDE_UP); + } else { + // Updated SDK and got a new error + // ERROR: venu: Cannot find symbol ':substring' on type 'PolyType'. + var id = mIdentifier as Lang.String; + if (mService == null) { + var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + id.substring(0, id.find(".")) + "/" + id.substring(id.find(".")+1, null); + if (Globals.scDebug) { + System.println("HomeAssistantService call() URL=" + url); + System.println("HomeAssistantService call() mIdentifier=" + mIdentifier); + } + Communications.makeWebRequest( + url, + null, + options, + method(:onReturnCall) + ); + } else { + var url = (Properties.getValue("api_url") as Lang.String) + "/services/" + mService.substring(0, mService.find(".")) + "/" + mService.substring(mService.find(".")+1, null); + if (Globals.scDebug) { + System.println("HomeAssistantService call() URL=" + url); + System.println("HomeAssistantService call() mService=" + mService); + } + Communications.makeWebRequest( + url, + { + "entity_id" => id + }, + options, + method(:onReturnCall) + ); + } + 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 + ]); + } + } + } + +} diff --git a/source/HomeAssistantView.mc b/source/HomeAssistantView.mc index a2c9ead..7a2318c 100644 --- a/source/HomeAssistantView.mc +++ b/source/HomeAssistantView.mc @@ -113,13 +113,13 @@ class HomeAssistantViewDelegate extends WatchUi.Menu2InputDelegate { if (Globals.scDebug) { System.println(haItem.getLabel() + " " + haItem.getId()); } - haItem.execScript(); + haItem.callService(); } else if (item instanceof HomeAssistantIconMenuItem) { var haItem = item as HomeAssistantIconMenuItem; if (Globals.scDebug) { System.println(haItem.getLabel() + " " + haItem.getId()); } - haItem.execScript(); + haItem.callService(); } else if (item instanceof HomeAssistantViewMenuItem) { var haMenuItem = item as HomeAssistantViewMenuItem; if (Globals.scDebug) {