mirror of
				https://github.com/house-of-abbey/GarminHomeAssistant.git
				synced 2025-10-31 15:48:13 +00:00 
			
		
		
		
	Reworked numericMenuItem to be able to display a different conten in the sublabel than jus a number.
This commit is contained in:
		| @@ -629,6 +629,10 @@ class HomeAssistantApp extends Application.AppBase { | |||||||
|                             if (item instanceof HomeAssistantToggleMenuItem) { |                             if (item instanceof HomeAssistantToggleMenuItem) { | ||||||
|                                 (item as HomeAssistantToggleMenuItem).updateToggleState(data[i.toString() + "t"]); |                                 (item as HomeAssistantToggleMenuItem).updateToggleState(data[i.toString() + "t"]); | ||||||
|                             } |                             } | ||||||
|  |                             if (item instanceof HomeAssistantNumericMenuItem) { | ||||||
|  |                                // (item as HomeAssistantNumericMenuItem).updateNumericState("22"); | ||||||
|  |                                 (item as HomeAssistantNumericMenuItem).updateNumericState(data[i.toString() + "n"].toString()); | ||||||
|  |                             } | ||||||
|                         } |                         } | ||||||
|                         if (Settings.getMenuCheck() && Settings.getCacheConfig() && !mIsCacheChecked) { |                         if (Settings.getMenuCheck() && Settings.getCacheConfig() && !mIsCacheChecked) { | ||||||
|                             // We are caching the menu configuration, so let's fetch it and check if its been updated. |                             // We are caching the menu configuration, so let's fetch it and check if its been updated. | ||||||
| @@ -723,6 +727,11 @@ class HomeAssistantApp extends Application.AppBase { | |||||||
|                                 "template" => (item as HomeAssistantToggleMenuItem).getToggleTemplate() |                                 "template" => (item as HomeAssistantToggleMenuItem).getToggleTemplate() | ||||||
|                             }); |                             }); | ||||||
|                         } |                         } | ||||||
|  |                         if (item instanceof HomeAssistantNumericMenuItem) { | ||||||
|  |                             mTemplates.put(i.toString() + "n", { | ||||||
|  |                                 "template" => (item as HomeAssistantNumericMenuItem).getNumericTemplate() | ||||||
|  |                             }); | ||||||
|  |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 // https://developers.home-assistant.io/docs/api/native-app-integration/sending-data/#render-templates |                 // https://developers.home-assistant.io/docs/api/native-app-integration/sending-data/#render-templates | ||||||
|   | |||||||
| @@ -68,6 +68,15 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem { | |||||||
|         mLabel                = label; |         mLabel                = label; | ||||||
|         mHomeAssistantService = haService; |         mHomeAssistantService = haService; | ||||||
|  |  | ||||||
|  |         var val = data.get("display_format"); | ||||||
|  |         if (val != null) { | ||||||
|  |             mFormatString = val.toString(); | ||||||
|  |         }    | ||||||
|  |         else { | ||||||
|  |             mFormatString = "%.1f"; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |  | ||||||
|         HomeAssistantMenuItem.initialize( |         HomeAssistantMenuItem.initialize( | ||||||
|             label, |             label, | ||||||
|             template, |             template, | ||||||
| @@ -137,10 +146,47 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem { | |||||||
|     //! @param b Ignored. It is included in order to match the expected function prototype of the callback method. |     //! @param b Ignored. It is included in order to match the expected function prototype of the callback method. | ||||||
|     // |     // | ||||||
|     function onConfirm(b as Lang.Boolean) as Void { |     function onConfirm(b as Lang.Boolean) as Void { | ||||||
|         mHomeAssistantService.call(mService, {"entity_id"  => mData.get("entity_id").toString(),mData.get("valueLabel").toString() => mValue}, mExit); |         //mHomeAssistantService.call(mService, {"entity_id"  => mData.get("entity_id").toString(),mData.get("valueLabel").toString() => mValue}, mExit); | ||||||
|          |         var dataAttribute = mData.get("data_attribute"); | ||||||
|  |         if (dataAttribute == null) { | ||||||
|  |             //return without call service if no data attribute is set to avoid crash | ||||||
|  |             WatchUi.popView(WatchUi.SLIDE_RIGHT); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         var entity_id = mData.get("entity_id"); | ||||||
|  |         if (entity_id == null) { | ||||||
|  |             //return without call service if no entity_id is set to avoid crash | ||||||
|  |             WatchUi.popView(WatchUi.SLIDE_RIGHT); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         mHomeAssistantService.call(mService, {"entity_id"  => entity_id.toString(),dataAttribute.toString() => mValue}, mExit); | ||||||
|  |         WatchUi.popView(WatchUi.SLIDE_RIGHT); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     //! Return a toggle menu item's state template. | ||||||
|  |     //! | ||||||
|  |     //! @return A string with the menu item's template definition (or null). | ||||||
|  |     // | ||||||
|  |     function getNumericTemplate() as Lang.String? { | ||||||
|  |         var entity_id = mData.get("entity_id"); | ||||||
|  |         if (entity_id != null) { | ||||||
|  |             return "{{state_attr('" + entity_id.toString() + "','" + mData.get("attribute").toString() +"')}}"; | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function updateNumericState(data as Lang.String or Lang.Dictionary or Null) as Void { | ||||||
|  |         if (data == null) { | ||||||
|  |             mValue="0"; | ||||||
|  |             return; | ||||||
|  |         } else if(data instanceof Lang.String) { | ||||||
|  |             mValue=data; | ||||||
|  |  | ||||||
|  |         } else { | ||||||
|  |             // Catch possible error | ||||||
|  |             mValue="0"; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|   |   | ||||||
|     //! Update the menu item's sub label to display the template rendered by Home Assistant. |     //! Update the menu item's sub label to display the template rendered by Home Assistant. | ||||||
| @@ -158,10 +204,11 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem { | |||||||
|             var f = data.toFloat() as Lang.Float; |             var f = data.toFloat() as Lang.Float; | ||||||
|             setSubLabel(f.format(mFormatString)); |             setSubLabel(f.format(mFormatString)); | ||||||
|         } else if (data instanceof Lang.String){ |         } else if (data instanceof Lang.String){ | ||||||
|  |             // This should not happen | ||||||
|             setSubLabel(data); |             setSubLabel(data); | ||||||
|         }   |         }   | ||||||
|         else { |         else { | ||||||
|             // The template must return a Float, or the item cannot be formatted locally without error. |             // The template must return a Float on Numeric value, or the item cannot be formatted locally without error. | ||||||
|             setSubLabel(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); |             setSubLabel(WatchUi.loadResource($.Rez.Strings.TemplateError) as Lang.String); | ||||||
|         } |         } | ||||||
|         WatchUi.requestUpdate(); |         WatchUi.requestUpdate(); | ||||||
| @@ -175,6 +222,10 @@ class HomeAssistantNumericMenuItem extends HomeAssistantMenuItem { | |||||||
|         mValue = value; |         mValue = value; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     function getValue() as Lang.String { | ||||||
|  |         return mValue; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     function getData() as Lang.Dictionary { |     function getData() as Lang.Dictionary { | ||||||
|         return mData; |         return mData; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -32,11 +32,11 @@ class HomeAssistantNumericFactory extends WatchUi.PickerFactory { | |||||||
|  |  | ||||||
|         // Get values from data |         // Get values from data | ||||||
|  |  | ||||||
|         var val = data.get("start"); |         var val = data.get("min"); | ||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             mStart = val.toString().toFloat(); |             mStart = val.toString().toFloat(); | ||||||
|         } |         } | ||||||
|         val = data.get("stop"); |         val = data.get("max"); | ||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             mStop = val.toString().toFloat(); |             mStop = val.toString().toFloat(); | ||||||
|         }  |         }  | ||||||
| @@ -44,7 +44,7 @@ class HomeAssistantNumericFactory extends WatchUi.PickerFactory { | |||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             mStep = val.toString().toFloat(); |             mStep = val.toString().toFloat(); | ||||||
|         }  |         }  | ||||||
|        val = data.get("formatString"); |        val = data.get("display_format"); | ||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             mFormatString = val.toString(); |             mFormatString = val.toString(); | ||||||
|         }  |         }  | ||||||
|   | |||||||
| @@ -37,18 +37,24 @@ class HomeAssistantNumericPicker extends WatchUi.Picker { | |||||||
|  |  | ||||||
|         var data = mItem.getData(); |         var data = mItem.getData(); | ||||||
|  |  | ||||||
|         var start = 0.0; |         var min = 0.0; | ||||||
|         var val = data.get("start"); |         var val = data.get("min"); | ||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             start = val.toString().toFloat(); |             min = val.toString().toFloat(); | ||||||
|         }  |         }  | ||||||
|         var step = 1.0; |         var step = 1.0; | ||||||
|         val = data.get("step"); |         val = data.get("step"); | ||||||
|         if (val != null) { |         if (val != null) { | ||||||
|             step = val.toString().toFloat(); |             step = val.toString().toFloat(); | ||||||
|         }  |         }  | ||||||
|         val = haItem.getSubLabel().toFloat(); |         val = haItem.getValue(); | ||||||
|         var index = ((val -start) / step).toNumber(); |         if (val != null) { | ||||||
|  |             val = val.toString().toFloat(); | ||||||
|  |         } else { | ||||||
|  |             // catch missing state to avoid crash | ||||||
|  |             val = min; | ||||||
|  |         } | ||||||
|  |         var index = ((val -min) / step).toNumber(); | ||||||
|  |  | ||||||
|         pickerOptions[:defaults]  =[index]; |         pickerOptions[:defaults]  =[index]; | ||||||
|  |  | ||||||
| @@ -96,7 +102,6 @@ class HomeAssistantNumericPickerDelegate extends WatchUi.PickerDelegate { | |||||||
|     public function onAccept(values as Lang.Array) as Lang.Boolean { |     public function onAccept(values as Lang.Array) as Lang.Boolean { | ||||||
|         var chosenValue = values[0].toString(); |         var chosenValue = values[0].toString(); | ||||||
|         mPicker.onConfirm(chosenValue); |         mPicker.onConfirm(chosenValue); | ||||||
|         WatchUi.popView(WatchUi.SLIDE_RIGHT); |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user