Packages
grizzly
7.0.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/node_information_send.ex
defmodule Grizzly.ZWave.Commands.NodeInformationSend do
@moduledoc """
Instruct a node to send its Node Information Frame to another node (typically
a controller).
### Params
* seq_number - the sequence number of the network managment command (required)
* destination_node_id - the node that should receive the node information frame (required)
* tx_options - the transmission options for the target node to use when sending its NIF (optional)
"""
@behaviour Grizzly.ZWave.Command
import Bitwise
alias Grizzly.ZWave.Command
alias Grizzly.ZWave.CommandClasses.NetworkManagementBasicNode
@type tx_opt :: :ack | :low_power | :no_route | :explore
@type param ::
{:seq_number, Grizzly.seq_number()}
| {:destination_node_id, Grizzly.node_id()}
| {:tx_options, [tx_opt()]}
@impl Grizzly.ZWave.Command
def new(params) do
command = %Command{
name: :node_information_send,
command_byte: 0x05,
command_class: NetworkManagementBasicNode,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl Grizzly.ZWave.Command
@spec encode_params(Command.t()) :: binary()
def encode_params(command) do
seq_number = Command.param!(command, :seq_number)
destination_node_id = Command.param!(command, :destination_node_id)
tx_options = Command.param(command, :tx_options, []) |> encode_tx_options()
<<seq_number::8, 0::8, destination_node_id::8, tx_options::8>>
end
@impl Grizzly.ZWave.Command
@spec decode_params(binary()) :: {:ok, [param()]}
def decode_params(<<seq_number::8, _reserved::8, destination_node_id::8, tx_options::8>>) do
{:ok,
[
seq_number: seq_number,
destination_node_id: destination_node_id,
tx_options: decode_tx_options(tx_options)
]}
end
@spec encode_tx_options([tx_opt()]) :: byte()
defp encode_tx_options(tx_options) do
Enum.reduce(tx_options, 0, fn tx_option, acc ->
acc ||| tx_opt_to_byte(tx_option)
end)
end
@spec decode_tx_options(byte()) :: [tx_opt()]
defp decode_tx_options(tx_options) do
[
if((tx_options &&& 0x01) == 0x01, do: :ack),
if((tx_options &&& 0x02) == 0x02, do: :low_power),
if((tx_options &&& 0x10) == 0x10, do: :no_route),
if((tx_options &&& 0x20) == 0x20, do: :explore)
]
|> Enum.filter(&Function.identity/1)
end
@spec tx_opt_to_byte(tx_opt()) :: byte()
defp tx_opt_to_byte(:ack), do: 0x01
defp tx_opt_to_byte(:low_power), do: 0x02
defp tx_opt_to_byte(:no_route), do: 0x10
defp tx_opt_to_byte(:explore), do: 0x20
end