Packages
grizzly
5.1.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_list_report.ex
defmodule Grizzly.ZWave.Commands.NodeListReport do
@moduledoc """
The NODE_LIST_REPORT command
"""
@behaviour Grizzly.ZWave.Command
import Bitwise
alias Grizzly.ZWave.{Command, DecodeError, NodeIdList}
alias Grizzly.ZWave.CommandClasses.NetworkManagementProxy
@impl true
def new(params) do
# TODO: validate params
command = %Command{
name: :node_list_report,
command_byte: 0x02,
command_class: NetworkManagementProxy,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl true
def encode_params(command) do
seq_number = Command.param!(command, :seq_number)
node_ids = encode_node_ids(Command.param!(command, :node_ids))
status = encode_status(Command.param!(command, :status))
controller_id = encode_controller_id(Command.param!(command, :controller_id))
<<seq_number, status, controller_id>> <> node_ids
end
@impl true
def decode_params(<<seq_number, status, controller_id, node_ids::binary>>) do
case decode_status(status) do
{:ok, status} ->
controller_id = decode_controller_id(controller_id)
node_ids = NodeIdList.parse(node_ids)
{:ok,
[
seq_number: seq_number,
controller_id: controller_id,
status: status,
node_ids: node_ids
]}
{:error, %DecodeError{}} = error ->
error
end
end
def encode_node_ids(node_ids) do
mask_bit = node_id_mask(node_ids)
<<mask_bit::little-integer-size(29)-unit(8)>>
end
def encode_status(:latest), do: 0x00
def encode_status(:outdated), do: 0x01
def decode_status(0x00), do: {:ok, :latest}
def decode_status(0x01), do: {:ok, :outdated}
def decode_status(byte),
do: {:error, %DecodeError{value: byte, param: :status, command: :node_list_report}}
def encode_controller_id(:unknown), do: 0x00
def encode_controller_id(byte), do: byte
def decode_controller_id(0x00), do: :unknown
def decode_controller_id(controller_id), do: controller_id
defp node_id_mask(node_ids) do
Enum.reduce(node_ids, 0, fn node_id, mask ->
mask_bit = 0 ||| 1 <<< (node_id - 1)
mask ||| mask_bit
end)
end
end