Current section

Files

Jump to
stex lib devices devices.ex
Raw

lib/devices/devices.ex

defmodule Stex.Devices do
@moduledoc """
SmartThings Devices API endpoint library
"""
@doc """
List all authorized devices
Max: 200 by default will return up to 200 devices.
## Examples
iex> client = Stex.connect(your_access_token)
iex> Stex.Devices.list(client)
"""
def list(client) do
options = [
params: %{
max: "200"
}
]
response = Stex.get!(client.api_base <> "devices", client.headers, options)
final =
response
|> Stex.parse_res
final.items
end
@doc """
SmartThings built in endpoint for finding devices based on capability
Max: 200 by default will return up to 200 devices.
** Curently Broken! **
## Examples
iex> client = Stex.connect(your_access_token)
iex> Stex.Devices.list_by_capability(client, "powerMeter")
"""
def list_by_capability(client, capability) do
options = [
params: %{
max: "200",
capability: "#{capability}"
}
]
response = Stex.get!(client.api_base <> "devices", client.headers,options)
final =
response
|> Stex.parse_res
final.items
end
@doc """
Show device
## Examples
iex> client = Stex.connect(your_access_token)
iex> Stex.Devices.show(client, "some-device-id")
"""
def show(client, device_id) do
response = Stex.get!(client.api_base <> "devices/#{device_id}", client.headers)
device =
response
|> Stex.parse_res
%{client: client, device: device}
end
@doc """
Get the current status of all of a device's component's attributes.
The results may be filtered if the requester only has permission to view a
subset of the device's components or capabilities. If the token is for
a SmartApp that created the device then it implicitly has permission for this api.
This function is chainable
## Examples
iex> client = Stex.connect(your_access_token)
iex> device = Stex.Devices.show(some_device_id)
iex> status = device |> show_status
"""
def show_status(%{device: device, client: client}) do
response = Stex.get!(client.api_base <> "devices/#{device.deviceId}/status", client.headers)
response
|> Stex.parse_res
end
@doc """
Get the status of all attributes of a the component. The results may be
filtered if the requester only has permission to view a subset of the component's capabilities.
If the token is for a SmartApp that created the device then it implicitly has permission for this api.
This function is chainable
## Examples
iex> client = Stex.connect(your_access_token)
iex> device = Stex.Devices.show(client, "some-device-id")
iex> component_status = device |> show_component_status("main")
"""
def show_component_status(%{device: device, client: client}, component_id) do
response = Stex.get!(client.api_base <> "devices/#{device.deviceId}/components/#{component_id}/status", client.headers)
response
|> Stex.parse_res
end
@doc """
Get the current status of a device component's capability. If the token is
for a SmartApp that created the device then it implicitly has permission for this api.
## Examples
iex> client = Stex.connect(your_access_token)
iex> device = Stex.Devices.show(client, "some-device-id")
iex> component_status = device |> show_capability_status("main", "powerMeter")
"""
def show_capability_status(%{device: device, client: client}, component_id, capability_id) do
response = Stex.get!(client.api_base <> "devices/#{device.deviceId}/components/#{component_id}/capabilities/#{capability_id}/status", client.headers)
response
|> Stex.parse_res
end
@doc """
Filter utility for finding devices with the specified capability.
## Examples
iex> client = Stex.connect(your_access_token)
iex> list = Stex.Devices.list(client)
iex> devices = Stex.Devices.filter_by_capability(list, "powerMeter")
"""
def filter_devices_by_capability(devices, capability) do
filtered = []
new_list =
for device <- devices do
if find_by_cap(List.first(device.components).capabilities, %{id: capability}) == true do
[device | filtered]
end
end
List.flatten(Enum.filter(new_list, & !is_nil(&1)))
end
# Utility function for finding the members of a list
defp find_by_cap(list, cap) do
Enum.member?(list, cap)
end
end