Packages
grizzly
0.6.6
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/command_class/association/get.ex
defmodule Grizzly.CommandClass.Association.Get do
@moduledoc """
Command module for working with ASSOCIATION GET command.
command options:
* `:group` - the group number
* `:seq_number` - The sequence number for the Z/IP Packet
* `:retries` - The number of times to resend the command (default 2)
"""
@behaviour Grizzly.Command
alias Grizzly.Packet
alias Grizzly.Command.{EncodeError, Encoding}
@type t :: %__MODULE__{
seq_number: non_neg_integer() | nil,
retries: non_neg_integer(),
group: byte(),
buffer: map()
}
@type opt ::
{:seq_number, Grizzly.seq_number()}
| {:retries, non_neg_integer()}
| {:group, byte()}
@enforce_keys [:group]
defstruct seq_number: nil, retries: 2, group: nil, buffer: %{nodes: []}
@impl true
@spec init([opt]) :: {:ok, t()}
def init(opts) do
{:ok, struct(__MODULE__, opts)}
end
@impl true
@spec encode(t()) :: {:ok, binary()} | {:error, EncodeError.t()}
def encode(%__MODULE__{seq_number: seq_number, group: group} = command) do
with {:ok, _encoded} <-
Encoding.encode_and_validate_args(command, %{
group: :byte
}) do
binary = Packet.header(seq_number) <> <<0x85, 0x02, group>>
{:ok, binary}
end
end
@impl true
@spec handle_response(t(), Packet.t()) ::
{:continue, t()}
| {:done, {:error, :nack_response}}
| {:done, {:ok, [Grizzly.Node.node_id()]}}
| {:queued, t()}
def handle_response(%__MODULE__{seq_number: seq_number} = command, %Packet{
seq_number: seq_number,
types: [:ack_response]
}) do
{:continue, command}
end
def handle_response(%__MODULE__{seq_number: seq_number, retries: 0}, %Packet{
seq_number: seq_number,
types: [:nack_response]
}) do
{:done, {:error, :nack_response}}
end
def handle_response(%__MODULE__{seq_number: seq_number, retries: n} = command, %Packet{
seq_number: seq_number,
types: [:nack_response]
}) do
{:retry, %{command | retries: n - 1}}
end
def handle_response(
%__MODULE__{seq_number: seq_number} = command,
%Packet{
seq_number: seq_number,
types: [:nack_response, :nack_waiting]
} = packet
) do
if Packet.sleeping_delay?(packet) do
{:queued, command}
else
{:continue, command}
end
end
def handle_response(%__MODULE__{buffer: %{nodes: nodes_so_far}}, %Packet{
body: %{
command_class: :association,
command: :report,
value: %{
reports_to_follow: 0,
group: group,
nodes: nodes,
max_nodes_supported: max_nodes_supported
}
}
}) do
{:done,
{:ok,
%{
group: group,
nodes: nodes ++ nodes_so_far,
max_nodes_supported: max_nodes_supported
}}}
end
def handle_response(
%__MODULE__{buffer: %{nodes: nodes_so_far}} = command,
%Packet{
body: %{
command_class: :association,
command: :report,
value: %{reports_to_follow: _n, nodes: nodes}
}
}
) do
updated_nodes = Enum.uniq(nodes ++ nodes_so_far)
updated_command = %__MODULE__{
command
| buffer: %{nodes: updated_nodes}
}
{:continue, updated_command}
end
def handle_response(%__MODULE__{} = command, _), do: {:continue, command}
end