mirror of
https://github.com/house-of-abbey/GarminHomeAssistant.git
synced 2025-07-13 16:28:30 +00:00
@ -47,6 +47,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
|
},
|
||||||
|
"exit": {
|
||||||
|
"$ref": "#/$defs/exit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["entity", "name", "type"],
|
"required": ["entity", "name", "type"],
|
||||||
@ -75,6 +81,9 @@
|
|||||||
"deprecated": true,
|
"deprecated": true,
|
||||||
"title": "Schema change:",
|
"title": "Schema change:",
|
||||||
"description": "Use 'info' or 'tap' instead."
|
"description": "Use 'info' or 'tap' instead."
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "content", "type"],
|
"required": ["name", "content", "type"],
|
||||||
@ -101,6 +110,12 @@
|
|||||||
},
|
},
|
||||||
"tap_action": {
|
"tap_action": {
|
||||||
"$ref": "#/$defs/tap_action"
|
"$ref": "#/$defs/tap_action"
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
|
},
|
||||||
|
"exit": {
|
||||||
|
"$ref": "#/$defs/exit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "content", "type", "tap_action"],
|
"required": ["name", "content", "type", "tap_action"],
|
||||||
@ -120,6 +135,9 @@
|
|||||||
"type": {
|
"type": {
|
||||||
"$ref": "#/$defs/type",
|
"$ref": "#/$defs/type",
|
||||||
"const": "info"
|
"const": "info"
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "content", "type"],
|
"required": ["name", "content", "type"],
|
||||||
@ -149,6 +167,12 @@
|
|||||||
},
|
},
|
||||||
"tap_action": {
|
"tap_action": {
|
||||||
"$ref": "#/$defs/tap_action"
|
"$ref": "#/$defs/tap_action"
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
|
},
|
||||||
|
"exit": {
|
||||||
|
"$ref": "#/$defs/exit"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "type"],
|
"required": ["name", "type"],
|
||||||
@ -181,6 +205,9 @@
|
|||||||
},
|
},
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/$defs/items"
|
"$ref": "#/$defs/items"
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"$ref": "#/$defs/enabled"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["name", "title", "type", "items"],
|
"required": ["name", "title", "type", "items"],
|
||||||
@ -293,6 +320,18 @@
|
|||||||
"required": ["type"]
|
"required": ["type"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"enabled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true,
|
||||||
|
"title": "Enable the menu item",
|
||||||
|
"description": "Typically used to temporarily disable a menu item, e.g. for seasonal variations. Enabled (true) by default."
|
||||||
|
},
|
||||||
|
"exit": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false,
|
||||||
|
"title": "Exit on selection",
|
||||||
|
"description": "Choose to exit the application after this item has been selected. Disabled (false) by default. N.B. Only actionable menu items can have this field added."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,3 +76,35 @@ Note that for notify events, you _must_ not supply an `entity_id` or the API cal
|
|||||||
> Be careful with the value of the `service` field.
|
> Be careful with the value of the `service` field.
|
||||||
|
|
||||||
Note that the `service` field will need to be a locally custom `script.<something>` as soon as any `data` fields are populated and not something more generic like `script.turn_on`. If the `service` field is wrong, the application will fail with a [`Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html) error in the response from your Home Assistant and show the error message as _"No JSON returned from HTTP request"_ on your device. In the [web-based editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) you can use the standard developer tools to observe an `HTTP 400` error which the application does not see. Here we are limited by the [Garmin Connect IQ](https://developer.garmin.com/connect-iq/overview/) software development kit (SDK). We do not have enough information at the point of execution in the application to determine the cause of the error. Nor is there an immediately obvious way of identifying this issue using the JSON schema checks.
|
Note that the `service` field will need to be a locally custom `script.<something>` as soon as any `data` fields are populated and not something more generic like `script.turn_on`. If the `service` field is wrong, the application will fail with a [`Communications.INVALID_HTTP_BODY_IN_NETWORK_RESPONSE`](https://developer.garmin.com/connect-iq/api-docs/Toybox/Communications.html) error in the response from your Home Assistant and show the error message as _"No JSON returned from HTTP request"_ on your device. In the [web-based editor](https://house-of-abbey.github.io/GarminHomeAssistant/web/) you can use the standard developer tools to observe an `HTTP 400` error which the application does not see. Here we are limited by the [Garmin Connect IQ](https://developer.garmin.com/connect-iq/overview/) software development kit (SDK). We do not have enough information at the point of execution in the application to determine the cause of the error. Nor is there an immediately obvious way of identifying this issue using the JSON schema checks.
|
||||||
|
|
||||||
|
## Exit on Tap
|
||||||
|
|
||||||
|
You can choose individual items that will quit after they have completed their action.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"entity": "automation.turn_off_stuff",
|
||||||
|
"name": "Turn off Stuff",
|
||||||
|
"type": "tap",
|
||||||
|
"tap_action": {
|
||||||
|
"service": "automation.trigger"
|
||||||
|
},
|
||||||
|
"exit": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Disable Menu Item
|
||||||
|
|
||||||
|
If you would like to temporarily disable an item in your menu, e.g. for seasonal reasons like not needing to turn on the heating in summer, then rather than swapping menu definition files or deleting a section of the menu you can mark the item as 'disabled'. This field applies to all menu items.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"entity": "automation.turn_off_stuff",
|
||||||
|
"name": "Turn off Stuff",
|
||||||
|
"type": "tap",
|
||||||
|
"tap_action": {
|
||||||
|
"service": "automation.trigger"
|
||||||
|
},
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -109,3 +109,29 @@ Then you can use the following in your config:
|
|||||||
"type": "toggle"
|
"type": "toggle"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Exit On Toggle
|
||||||
|
|
||||||
|
You can choose individual items that will quit after they have completed their action.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"entity": "light.hall_light",
|
||||||
|
"name": "Hall Light & Quit",
|
||||||
|
"type": "toggle",
|
||||||
|
"exit": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Disable Menu Item
|
||||||
|
|
||||||
|
If you would like to temporarily disable an item in your menu, e.g. for seasonal reasons like not needing to turn on Christmas tree lights outside the festive season, then rather than swapping menu definition files or deleting a section of the menu you can mark the item as 'disabled'. This field applies to all menu items.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"entity": "light.chrissmas_tree",
|
||||||
|
"name": "Christmas Lights",
|
||||||
|
"type": "toggle",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
@ -218,6 +218,19 @@ An example of a dimmer light with 4 brightness settings 0..3. Here our light wor
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Disable Menu Item
|
||||||
|
|
||||||
|
If you would like to temporarily disable an item in your menu, then rather than swapping menu definition files or deleting a section of the menu you can mark the item as 'disabled'. This field applies to all menu items.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Phone",
|
||||||
|
"type": "info",
|
||||||
|
"content": "{{ ... }}",
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Warnings
|
## Warnings
|
||||||
|
|
||||||
Just remember, on older smaller memory devices **you have the ability to crash the application by creating an excessive menu definition**. Templates can require significant definition for highly customised text. Don't be silly.
|
Just remember, on older smaller memory devices **you have the ability to crash the application by creating an excessive menu definition**. Templates can require significant definition for highly customised text. Don't be silly.
|
||||||
|
BIN
images/Venu2_Glance_good.png
Normal file
BIN
images/Venu2_Glance_good.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
@ -77,15 +77,17 @@ class HomeAssistantMenuItemFactory {
|
|||||||
label as Lang.String or Lang.Symbol,
|
label as Lang.String or Lang.Symbol,
|
||||||
entity_id as Lang.String or Null,
|
entity_id as Lang.String or Null,
|
||||||
template as Lang.String or Null,
|
template as Lang.String or Null,
|
||||||
|
exit as Lang.Boolean,
|
||||||
confirm as Lang.Boolean,
|
confirm as Lang.Boolean,
|
||||||
pin as Lang.Boolean
|
pin as Lang.Boolean
|
||||||
) as WatchUi.MenuItem {
|
) as WatchUi.MenuItem {
|
||||||
return new HomeAssistantToggleMenuItem(
|
return new HomeAssistantToggleMenuItem(
|
||||||
label,
|
label,
|
||||||
template,
|
template,
|
||||||
|
{ "entity_id" => entity_id },
|
||||||
|
exit,
|
||||||
confirm,
|
confirm,
|
||||||
pin,
|
pin,
|
||||||
{ "entity_id" => entity_id },
|
|
||||||
mMenuItemOptions
|
mMenuItemOptions
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -105,9 +107,10 @@ class HomeAssistantMenuItemFactory {
|
|||||||
entity_id as Lang.String or Null,
|
entity_id as Lang.String or Null,
|
||||||
template as Lang.String or Null,
|
template as Lang.String or Null,
|
||||||
service as Lang.String or Null,
|
service as Lang.String or Null,
|
||||||
|
data as Lang.Dictionary or Null,
|
||||||
|
exit as Lang.Boolean,
|
||||||
confirm as Lang.Boolean,
|
confirm as Lang.Boolean,
|
||||||
pin as Lang.Boolean,
|
pin as Lang.Boolean
|
||||||
data as Lang.Dictionary or Null
|
|
||||||
) as WatchUi.MenuItem {
|
) as WatchUi.MenuItem {
|
||||||
if (entity_id != null) {
|
if (entity_id != null) {
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
@ -121,9 +124,10 @@ class HomeAssistantMenuItemFactory {
|
|||||||
label,
|
label,
|
||||||
template,
|
template,
|
||||||
service,
|
service,
|
||||||
|
data,
|
||||||
|
exit,
|
||||||
confirm,
|
confirm,
|
||||||
pin,
|
pin,
|
||||||
data,
|
|
||||||
mTapTypeIcon,
|
mTapTypeIcon,
|
||||||
mMenuItemOptions,
|
mMenuItemOptions,
|
||||||
mHomeAssistantService
|
mHomeAssistantService
|
||||||
@ -133,9 +137,10 @@ class HomeAssistantMenuItemFactory {
|
|||||||
label,
|
label,
|
||||||
template,
|
template,
|
||||||
service,
|
service,
|
||||||
|
data,
|
||||||
|
exit,
|
||||||
confirm,
|
confirm,
|
||||||
pin,
|
pin,
|
||||||
data,
|
|
||||||
mInfoTypeIcon,
|
mInfoTypeIcon,
|
||||||
mMenuItemOptions,
|
mMenuItemOptions,
|
||||||
mHomeAssistantService
|
mHomeAssistantService
|
||||||
|
@ -46,7 +46,13 @@ class HomeAssistantService {
|
|||||||
data as Null or Lang.Dictionary or Lang.String,
|
data as Null or Lang.Dictionary or Lang.String,
|
||||||
context as Lang.Object
|
context as Lang.Object
|
||||||
) as Void {
|
) as Void {
|
||||||
var entity_id = context as Lang.String or Null;
|
var c = context as Lang.Dictionary;
|
||||||
|
var entity_id;
|
||||||
|
var exit = false;
|
||||||
|
if (c != null) {
|
||||||
|
entity_id = c.get(:entity_id) as Lang.String;
|
||||||
|
exit = c.get(:exit) as Lang.Boolean;
|
||||||
|
}
|
||||||
// System.println("HomeAssistantService onReturnCall() Response Code: " + responseCode);
|
// System.println("HomeAssistantService onReturnCall() Response Code: " + responseCode);
|
||||||
// System.println("HomeAssistantService onReturnCall() Response Data: " + data);
|
// System.println("HomeAssistantService onReturnCall() Response Data: " + data);
|
||||||
|
|
||||||
@ -102,6 +108,9 @@ class HomeAssistantService {
|
|||||||
:bgcolor => Graphics.COLOR_BLACK
|
:bgcolor => Graphics.COLOR_BLACK
|
||||||
}).pushView(WatchUi.SLIDE_IMMEDIATE);
|
}).pushView(WatchUi.SLIDE_IMMEDIATE);
|
||||||
}
|
}
|
||||||
|
if (exit) {
|
||||||
|
System.exit();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -117,7 +126,8 @@ class HomeAssistantService {
|
|||||||
//
|
//
|
||||||
function call(
|
function call(
|
||||||
service as Lang.String,
|
service as Lang.String,
|
||||||
data as Lang.Dictionary or Null
|
data as Lang.Dictionary or Null,
|
||||||
|
exit as Lang.Boolean
|
||||||
) as Void {
|
) as Void {
|
||||||
if (! System.getDeviceSettings().phoneConnected) {
|
if (! System.getDeviceSettings().phoneConnected) {
|
||||||
// System.println("HomeAssistantService call(): No Phone connection, skipping API call.");
|
// System.println("HomeAssistantService call(): No Phone connection, skipping API call.");
|
||||||
@ -149,7 +159,10 @@ class HomeAssistantService {
|
|||||||
"Authorization" => "Bearer " + Settings.getApiKey()
|
"Authorization" => "Bearer " + Settings.getApiKey()
|
||||||
},
|
},
|
||||||
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON,
|
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_JSON,
|
||||||
:context => entity_id
|
:context => {
|
||||||
|
:entity_id => entity_id,
|
||||||
|
:exit => exit
|
||||||
|
}
|
||||||
},
|
},
|
||||||
method(:onReturnCall)
|
method(:onReturnCall)
|
||||||
);
|
);
|
||||||
|
@ -23,6 +23,7 @@ class HomeAssistantTapMenuItem extends HomeAssistantMenuItem {
|
|||||||
private var mHomeAssistantService as HomeAssistantService;
|
private var mHomeAssistantService as HomeAssistantService;
|
||||||
private var mService as Lang.String or Null;
|
private var mService as Lang.String or Null;
|
||||||
private var mConfirm as Lang.Boolean;
|
private var mConfirm as Lang.Boolean;
|
||||||
|
private var mExit as Lang.Boolean;
|
||||||
private var mPin as Lang.Boolean;
|
private var mPin as Lang.Boolean;
|
||||||
private var mData as Lang.Dictionary or Null;
|
private var mData as Lang.Dictionary or Null;
|
||||||
|
|
||||||
@ -43,9 +44,10 @@ class HomeAssistantTapMenuItem extends HomeAssistantMenuItem {
|
|||||||
label as Lang.String or Lang.Symbol,
|
label as Lang.String or Lang.Symbol,
|
||||||
template as Lang.String,
|
template as Lang.String,
|
||||||
service as Lang.String or Null,
|
service as Lang.String or Null,
|
||||||
|
data as Lang.Dictionary or Null,
|
||||||
|
exit as Lang.Boolean,
|
||||||
confirm as Lang.Boolean,
|
confirm as Lang.Boolean,
|
||||||
pin as Lang.Boolean,
|
pin as Lang.Boolean,
|
||||||
data as Lang.Dictionary or Null,
|
|
||||||
icon as Graphics.BitmapType or WatchUi.Drawable,
|
icon as Graphics.BitmapType or WatchUi.Drawable,
|
||||||
options as {
|
options as {
|
||||||
:alignment as WatchUi.MenuItem.Alignment,
|
:alignment as WatchUi.MenuItem.Alignment,
|
||||||
@ -67,9 +69,10 @@ class HomeAssistantTapMenuItem extends HomeAssistantMenuItem {
|
|||||||
|
|
||||||
mHomeAssistantService = haService;
|
mHomeAssistantService = haService;
|
||||||
mService = service;
|
mService = service;
|
||||||
|
mData = data;
|
||||||
|
mExit = exit;
|
||||||
mConfirm = confirm;
|
mConfirm = confirm;
|
||||||
mPin = pin;
|
mPin = pin;
|
||||||
mData = data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Call a Home Assistant service only after checks have been done for confirmation or PIN entry.
|
//! Call a Home Assistant service only after checks have been done for confirmation or PIN entry.
|
||||||
@ -103,7 +106,7 @@ class HomeAssistantTapMenuItem extends HomeAssistantMenuItem {
|
|||||||
//
|
//
|
||||||
function onConfirm(b as Lang.Boolean) as Void {
|
function onConfirm(b as Lang.Boolean) as Void {
|
||||||
if (mService != null) {
|
if (mService != null) {
|
||||||
mHomeAssistantService.call(mService, mData);
|
mHomeAssistantService.call(mService, mData, mExit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,10 +22,11 @@ using Toybox.Timer;
|
|||||||
//! Light or switch toggle menu button that calls the API to maintain the up to date state.
|
//! Light or switch toggle menu button that calls the API to maintain the up to date state.
|
||||||
//
|
//
|
||||||
class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
||||||
private var mConfirm as Lang.Boolean;
|
|
||||||
private var mPin as Lang.Boolean;
|
|
||||||
private var mData as Lang.Dictionary;
|
private var mData as Lang.Dictionary;
|
||||||
private var mTemplate as Lang.String;
|
private var mTemplate as Lang.String;
|
||||||
|
private var mExit as Lang.Boolean;
|
||||||
|
private var mConfirm as Lang.Boolean;
|
||||||
|
private var mPin as Lang.Boolean;
|
||||||
private var mHasVibrate as Lang.Boolean = false;
|
private var mHasVibrate as Lang.Boolean = false;
|
||||||
|
|
||||||
//! Class Constructor
|
//! Class Constructor
|
||||||
@ -40,9 +41,10 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
function initialize(
|
function initialize(
|
||||||
label as Lang.String or Lang.Symbol,
|
label as Lang.String or Lang.Symbol,
|
||||||
template as Lang.String,
|
template as Lang.String,
|
||||||
|
data as Lang.Dictionary or Null,
|
||||||
|
exit as Lang.Boolean,
|
||||||
confirm as Lang.Boolean,
|
confirm as Lang.Boolean,
|
||||||
pin as Lang.Boolean,
|
pin as Lang.Boolean,
|
||||||
data as Lang.Dictionary or Null,
|
|
||||||
options as {
|
options as {
|
||||||
:alignment as WatchUi.MenuItem.Alignment,
|
:alignment as WatchUi.MenuItem.Alignment,
|
||||||
:icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol
|
:icon as Graphics.BitmapType or WatchUi.Drawable or Lang.Symbol
|
||||||
@ -58,10 +60,11 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
if (Attention has :vibrate) {
|
if (Attention has :vibrate) {
|
||||||
mHasVibrate = true;
|
mHasVibrate = true;
|
||||||
}
|
}
|
||||||
mConfirm = confirm;
|
|
||||||
mPin = pin;
|
|
||||||
mData = data;
|
mData = data;
|
||||||
mTemplate = template;
|
mTemplate = template;
|
||||||
|
mExit = exit;
|
||||||
|
mConfirm = confirm;
|
||||||
|
mPin = pin;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Set the state of a toggle menu item.
|
//! Set the state of a toggle menu item.
|
||||||
@ -212,6 +215,9 @@ class HomeAssistantToggleMenuItem extends WatchUi.ToggleMenuItem {
|
|||||||
ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode);
|
ErrorView.show(WatchUi.loadResource($.Rez.Strings.UnhandledHttpErr) as Lang.String + responseCode);
|
||||||
}
|
}
|
||||||
getApp().setApiStatus(status);
|
getApp().setApiStatus(status);
|
||||||
|
if (mExit) {
|
||||||
|
System.exit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Set the state of the toggle menu item.
|
//! Set the state of the toggle menu item.
|
||||||
|
@ -51,21 +51,42 @@ class HomeAssistantView extends WatchUi.Menu2 {
|
|||||||
var confirm = false as Lang.Boolean or Null;
|
var confirm = false as Lang.Boolean or Null;
|
||||||
var pin = false as Lang.Boolean or Null;
|
var pin = false as Lang.Boolean or Null;
|
||||||
var data = null as Lang.Dictionary or Null;
|
var data = null as Lang.Dictionary or Null;
|
||||||
|
var enabled = true as Lang.Boolean or Null;
|
||||||
|
var exit = false as Lang.Boolean or Null;
|
||||||
|
if (items[i].get("enabled") != null) {
|
||||||
|
enabled = items[i].get("enabled"); // Optional
|
||||||
|
}
|
||||||
|
if (items[i].get("exit") != null) {
|
||||||
|
exit = items[i].get("exit"); // Optional
|
||||||
|
}
|
||||||
if (tap_action != null) {
|
if (tap_action != null) {
|
||||||
service = tap_action.get("service");
|
service = tap_action.get("service");
|
||||||
confirm = tap_action.get("confirm"); // Optional
|
|
||||||
pin = tap_action.get("pin"); // Optional
|
|
||||||
data = tap_action.get("data"); // Optional
|
data = tap_action.get("data"); // Optional
|
||||||
if (confirm == null) {
|
if (tap_action.get("confirm") != null) {
|
||||||
confirm = false;
|
confirm = tap_action.get("confirm"); // Optional
|
||||||
|
}
|
||||||
|
if (tap_action.get("pin") != null) {
|
||||||
|
pin = tap_action.get("pin"); // Optional
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (type != null && name != null) {
|
if (type != null && name != null && enabled) {
|
||||||
if (type.equals("toggle") && entity != null) {
|
if (type.equals("toggle") && entity != null) {
|
||||||
addItem(HomeAssistantMenuItemFactory.create().toggle(name, entity, content, confirm, pin));
|
addItem(HomeAssistantMenuItemFactory.create().toggle(name, entity, content, exit, confirm, pin));
|
||||||
} else if ((type.equals("tap") && service != null) || (type.equals("info") && content != null) || (type.equals("template") && content != null)) {
|
} else if (type.equals("tap") && service != null) {
|
||||||
|
addItem(HomeAssistantMenuItemFactory.create().tap(name, entity, content, service, data, exit, confirm, pin));
|
||||||
|
} else if (type.equals("template") && content != null) {
|
||||||
// NB. "template" is deprecated in the schema and remains only for backward compatibility. All menu items can now use templates, so the replacement is "info".
|
// NB. "template" is deprecated in the schema and remains only for backward compatibility. All menu items can now use templates, so the replacement is "info".
|
||||||
addItem(HomeAssistantMenuItemFactory.create().tap(name, entity, content, service, confirm, pin, data));
|
// The exit option is dependent on the type of template.
|
||||||
|
if (tap_action == null) {
|
||||||
|
// No exit from an information only item
|
||||||
|
addItem(HomeAssistantMenuItemFactory.create().tap(name, entity, content, service, data, false, confirm, pin));
|
||||||
|
} else {
|
||||||
|
// You may exit from template item with a 'tap_action'.
|
||||||
|
addItem(HomeAssistantMenuItemFactory.create().tap(name, entity, content, service, data, exit, confirm, pin));
|
||||||
|
}
|
||||||
|
} else if (type.equals("info") && content != null) {
|
||||||
|
// Cannot exit from a non-actionable information only menu item.
|
||||||
|
addItem(HomeAssistantMenuItemFactory.create().tap(name, entity, content, service, data, false, confirm, pin));
|
||||||
} else if (type.equals("group")) {
|
} else if (type.equals("group")) {
|
||||||
addItem(HomeAssistantMenuItemFactory.create().group(items[i], content));
|
addItem(HomeAssistantMenuItemFactory.create().group(items[i], content));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user