house-of-abbey / GarminHomeAssistant

Garmin application to provide a dashboard to control your Home Assistant
https://community.home-assistant.io/t/home-assistant-app-for-garmin/637348
MIT License
82 stars 12 forks source link

Allow parameters to be send with tap menu items #52

Closed philipabbey closed 8 months ago

philipabbey commented 8 months ago

Request from thebogeyman (Marc Schermann) at https://community.home-assistant.io/t/home-assistant-app-for-garmin/637348/107:

Is it somehow possible to add parameters to a script when calling it via the tap_action? I have something like this:

service: script.send_message
data:
  message: This is a message
  volume: 0.7

This would suggest a JSON format along the lines of:

{
  "$schema": "https://raw.githubusercontent.com/house-of-abbey/GarminHomeAssistant/main/config.schema.json",
  "title": "Home",
  "items": [
    {
      "entity": "script.configurable_item",
      "name": "Set Volume",
      "type": "tap",
      "tap_action": {
        "service": "script.send_message",
        "data": {
          "message": "This is a message",
          "volume": 0.7
        }
      }
    }
  ]
}

So the changes required are to store the parameters in the local menu item to be included in the makeWebRequest() call. This might be best done as keeping the data part of the JSON object as a Lang.Dictionary Monkey C object in order to include just one additional item into the HTTP call.

philipabbey commented 8 months ago

Example API call that I have working locally on a light bulb. Actually 3 LEDs @JosephAbbey put on a RP2040 to provide brightness levels 0-3 via a Home Assistant template that does some translation.

#!/bin/bash
#
#                      brightness%
# ./service_param.bash 19
#

API_KEY="<Your API Key>"
URL="<Your API URL>"

level=${1:-50}

echo "Brightness level: ${level}"

json='{
  "entity_id":      "light.<your light>",
  "brightness_pct": '${level}'
}'

curl -s -X POST \
  -H "Authorization: Bearer ${API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${json}" \
  ${URL}/services/light/turn_on

echo ""

As can be seen from the JSON, it is actually just a case of extracting the proposed tap_action's data field to augment the JSON in the API request as siblings of entity_id. So this change is relatively simple.

Awaiting the code churn from #26 as the changes will collide.

philipabbey commented 8 months ago

Within the data parts of the JSON we are unable to provide schema checking. This means the application can crash if the parameters are wrong. For instance I mistakenly added "confirm": true inside data and on the 4th tap we application crashed.

{
  "$schema": "https://raw.githubusercontent.com/house-of-abbey/GarminHomeAssistant/main/config.schema.json",
  "title": "Home",
  "items": [
    {
      "entity": "script.configurable_item",
      "name": "Set Volume",
      "type": "tap",
      "tap_action": {
        "service": "script.send_message",
        "data": {
          "message": "This is a message",
          "volume": 0.7
        }
      }
    }
  ]
}