Packages
grizzly
7.3.0
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_provisioning_set.ex
defmodule Grizzly.ZWave.Commands.NodeProvisioningSet do
@moduledoc """
Module for working with the `NODE_PROVISIONING_SET` command
This command adds a node to the node provisioning list.
Params:
* `:seq_number` - the network command sequence number (required)
* `:dsk` - a DSK string for the device see `Grizzly.ZWave.DSK` for more
more information (required)
* `:meta_extensions` - a list of `Grizzly.ZWave.SmartStart.MetaExtension.t()`
(optional default `[]`)
"""
@behaviour Grizzly.ZWave.Command
alias Grizzly.ZWave.{Command, DecodeError, DSK}
alias Grizzly.ZWave.CommandClasses.NodeProvisioning
alias Grizzly.ZWave.SmartStart.MetaExtension
@type param() ::
{:seq_number, Grizzly.ZWave.seq_number()}
| {:dsk, DSK.t()}
| {:meta_extensions, [MetaExtension.extension()]}
@impl true
@spec new([param]) :: {:ok, Command.t()}
def new(params) do
command = %Command{
name: :node_provisioning_set,
command_byte: 0x01,
command_class: NodeProvisioning,
params: params_with_defaults(params),
impl: __MODULE__
}
{:ok, command}
end
@impl true
@spec encode_params(Command.t()) :: binary()
def encode_params(command) do
seq_number = Command.param!(command, :seq_number)
meta_extensions = Command.param!(command, :meta_extensions)
dsk = Command.param!(command, :dsk)
dsk_byte_size = byte_size(dsk.raw)
<<seq_number, 0x00::size(3), dsk_byte_size::size(5)>> <>
dsk.raw <> NodeProvisioning.encode_meta_extensions(meta_extensions)
end
@impl true
@spec decode_params(binary()) :: {:ok, [param()]} | {:error, DecodeError.t()}
# TODO: same problem with no function call
def decode_params(
<<seq_number, _::size(3), dsk_byte_size::size(5),
dsk_binary::binary-size(dsk_byte_size)-unit(8), meta_extensions_binary::binary>>
) do
with {:ok, dsk_string} <- DSK.binary_to_string(dsk_binary),
meta_extensions <- MetaExtension.parse(meta_extensions_binary) do
{:ok,
[
seq_number: seq_number,
dsk: dsk_string,
meta_extensions: meta_extensions
]}
else
{:error, reason} when reason in [:dsk_too_short, :dsk_too_long] ->
{:error, %DecodeError{value: dsk_binary, param: :dsk, command: :node_provisioning_set}}
{:error, _other} ->
{:error,
%DecodeError{
value: meta_extensions_binary,
param: :meta_extension,
command: :node_provisioning_set
}}
end
end
defp params_with_defaults(params) do
defaults = [meta_extensions: []]
Keyword.merge(defaults, params)
end
end