Packages
grizzly
8.2.2
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/grizzly/zwave/commands/indicator_set.ex
defmodule Grizzly.ZWave.Commands.IndicatorSet do
@moduledoc """
This command is used to manipulate one or more indicator resources at a supporting node.
Params:
* `:value` - This field is used to enable or disable the indicator resource (required if v1 - optional and ignored otherwise)
* `:resources` - Indicator objects, each with an indicator id, property id and value (optional, v2+)
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave.{Command, DecodeError}
alias Grizzly.ZWave.CommandClasses.Indicator
@type param :: {:value, Indicator.value()} | {:resource, [Indicator.resource()]}
@impl true
@spec new([param()]) :: {:ok, Command.t()}
def new(params) do
command = %Command{
name: :indicator_set,
command_byte: 0x01,
command_class: Indicator,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl true
@spec encode_params(Command.t()) :: binary()
def encode_params(command) do
value = Command.param(command, :value)
if value != nil do
<<value>>
else
resources = Command.param!(command, :resources)
resources_binary =
for resource <- resources, into: <<>> do
indicator_id_byte =
Keyword.fetch!(resource, :indicator_id) |> Indicator.indicator_id_to_byte()
property_id = Keyword.fetch!(resource, :property_id)
property_id_byte = Indicator.property_id_to_byte(property_id)
value = Keyword.fetch!(resource, :value) |> Indicator.value_to_byte(property_id)
<<indicator_id_byte, property_id_byte, value>>
end
count = Enum.count(resources)
<<0x00, 0x00::size(3), count::size(5)>> <> resources_binary
end
end
@impl true
@spec decode_params(binary()) :: {:ok, [param()]} | {:error, DecodeError.t()}
def decode_params(<<value>>) do
{:ok, [value: value]}
end
def decode_params(<<_ignored, 0x00::size(3), _count::size(5), resources_binary::binary>>) do
:binary.bin_to_list(resources_binary)
|> Enum.chunk_every(3)
|> Enum.reduce_while(
{:ok, [resources: []]},
fn [indicator_id_byte, property_id_byte, value], {:ok, [resources: acc]} ->
with {:ok, indicator_id} <- Indicator.indicator_id_from_byte(indicator_id_byte),
{:ok, property_id} <- Indicator.property_id_from_byte(property_id_byte),
{:ok, decoded_value} <- Indicator.value_from_byte(value, property_id) do
{:cont,
{:ok,
[
resources: [
[indicator_id: indicator_id, property_id: property_id, value: decoded_value] | acc
]
]}}
else
{:error, %DecodeError{} = decode_error} ->
{:halt, {:error, %DecodeError{decode_error | command: :indicator_set}}}
end
end
)
end
end