Home > OS >  ecobee API thermostat request (json) using bash and curl
ecobee API thermostat request (json) using bash and curl

Time:02-16

I'm writing a bash script to interface with my ecobee (query info and change settings). I have the authorization all worked out (access token and refresh token) and am now trying to request info from the ecobee. This json parameter list is dynamically created. None of the curl examples in the Developers API Doc seem to work.

I've tried assigning the json to a variable (?json="$selection") and to a file (?json=@"$location"). My latest attempt (hard coding the json and escaping the braces) of the curl is as follows:

response=$(curl -s "https://api.ecobee.com/1/thermostat?json=\{"selection":\{"selectionType":"registered","selectionMatch":null,"includeRuntime":true,"includeSettings":true/}/}" -H "Content-Type: application/json;charset=UTF-8" -H "Authorization: Bearer $access_token")

and I received a null response declare -- response=""

If I have curl read from a file: {"selection":{"selectionType":"registered","selectionMatch":null,"includeRuntime":true,"includeSettings":true}}

then I receive:

response='{
  "status": {
    "code": 4,
    "message": "Serialization error. Malformed json. Check your request and parameters are valid."
  }
}'

Which I assuming it' an escape issue?

Can anyone offer any insight? Again, I thought this would be the easy part. I'm using jq to build my request json. Other alternatives to curl that can better deal with json? I'm limited to bash (which is what I know)

Thanks

CodePudding user response:

To integrate (arbitrary) data into a URL (or URI in general) you need to prepare it using percent-encoding first.

As you have mentioned to use jq to compose that data, you could add @uri to your jq filter to perform the encoding, and use the --raw-output (or -r) option to then output it properly.

For example, jq -r '@uri' applied to your JSON

{
  "selection": {
    "selectionType": "registered",
    "selectionMatch": null,
    "includeRuntime": true,
    "includeSettings": true
  }
}

would output

{"selection":{"selectionType":"registered","selectionMatch":null,"includeRuntime":true,"includeSettings":true}}

which you can use within the query string ?json=….

  • Related