Packages
grizzly
5.2.7
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_info_cached_report.ex
defmodule Grizzly.ZWave.Commands.NodeInfoCacheReport do
@moduledoc """
Report the cached node information
This command is normally used to respond to the `NodeInfoCacheGet` command
Params:
- `:seq_number` - the sequence number of the network command, normally from
from the `NodeInfoCacheGet` command (required)
- `:status` - the status fo the node information (required)
- `:age` - the age of the cache data. A number that is expressed `2 ^ n`
minutes (required)
- `:listening?` - if the node is listening node or sleeping node (required)
- `:command_classes` - a list of lists of command classes tagged by security attributes (optional default empty
list)
- `:basic_device_class` - the basic device class (required)
- `:generic_device_class` - the generic device class (required)
- `:specific_device_class` - the specific device class (required)
"""
@behaviour Grizzly.ZWave.Command
import Bitwise
alias Grizzly.ZWave.Command
alias Grizzly.ZWave.CommandClasses.NetworkManagementProxy
alias Grizzly.ZWave.{CommandClasses, DeviceClasses}
@typedoc """
The status of the refresh of the node information cache
Status:
- `:ok` - the requested node id could found and up-to-date information is
returned
- `:not_responding` - the requested node id could be found but fresh
information could not be retrieved
- `:unknown` - the node id is unknown
"""
@type status :: :ok | :not_responding | :unknown
@type tagged_command_classes ::
{:non_secure_supported, [CommandClasses.command_class()]}
| {:non_secure_controlled, [CommandClasses.command_class()]}
| {:secure_supported, [CommandClasses.command_class()]}
| {:secure_controlled, [CommandClasses.command_class()]}
@type param ::
{:seq_number, Grizzly.seq_number()}
| {:status, status()}
| {:age, 1..14}
| {:listening?, boolean()}
| {:command_classes, [tagged_command_classes]}
| {:basic_device_class, DeviceClasses.basic_device_class()}
| {:generic_device_class, DeviceClasses.generic_device_class()}
| {:specific_device_class, DeviceClasses.specific_device_class()}
@impl true
@spec new([param]) :: {:ok, Grizzly.ZWave.Command.t()}
def new(params) do
# TODO validate params
command = %Command{
name: :node_info_cache_report,
command_byte: 0x04,
command_class: NetworkManagementProxy,
params: params,
impl: __MODULE__
}
{:ok, command}
end
@impl true
def encode_params(command) do
seq_number = Command.param!(command, :seq_number)
status_byte = encode_status(Command.param!(command, :status))
age = Command.param!(command, :age)
listening_byte = encode_listening?(Command.param!(command, :listening?))
command_classes = Command.param!(command, :command_classes)
basic_device_class_byte =
DeviceClasses.basic_device_class_to_byte(Command.param!(command, :basic_device_class))
generic_device_class = Command.param!(command, :generic_device_class)
specific_device_class_byte =
DeviceClasses.specific_device_class_to_byte(
generic_device_class,
Command.param!(command, :specific_device_class)
)
optional_functionality_byte = encode_optional_functionality_byte(command_classes)
# the `0x00` byte is a reserved byte for Z-Wave and must be set to 0x00
<<seq_number, status_byte ||| age, listening_byte, optional_functionality_byte, 0x00,
basic_device_class_byte, DeviceClasses.generic_device_class_to_byte(generic_device_class),
specific_device_class_byte>> <> CommandClasses.command_class_list_to_binary(command_classes)
end
@impl true
def decode_params(
<<seq_number, status::size(4), age::size(4), list?::size(1), _::size(7), _, _keys,
basic_device_class_byte, generic_device_class_byte, specific_device_class_byte,
command_classes::binary>>
) do
{:ok, basic_device_class} =
DeviceClasses.basic_device_class_from_byte(basic_device_class_byte)
{:ok, generic_device_class} =
DeviceClasses.generic_device_class_from_byte(generic_device_class_byte)
{:ok, specific_device_class} =
DeviceClasses.specific_device_class_from_byte(
generic_device_class,
specific_device_class_byte
)
{:ok,
[
seq_number: seq_number,
basic_device_class: basic_device_class,
generic_device_class: generic_device_class,
specific_device_class: specific_device_class,
listening?: bit_to_bool(list?),
command_classes: CommandClasses.command_class_list_from_binary(command_classes),
status: decode_status(status),
age: age
]}
end
def encode_status(_), do: 0
def encode_command_classes(_), do: 0
def encode_listening?(true), do: 0x80
def encode_listening?(false), do: 0x00
def bit_to_bool(bit), do: bit == 1
def encode_optional_functionality_byte([]), do: 0x00
def encode_optional_functionality_byte(_), do: 0x80
def decode_command_classes(""), do: []
def decode_command_classes(_), do: []
def decode_status(0x00), do: :ok
def decode_status(0x01), do: :not_responding
def decode_status(0x02), do: :unknown
end