Packages
grizzly
0.14.8
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_get.ex
defmodule Grizzly.ZWave.Commands.NodeInfoCachedGet do
@moduledoc """
Get the node information that is cached on another device
This is useful for getting the command classes and device classes
When sending this command the Z-Wave network should send back a
`NodeInfoCachedReport` command.
Params:
`:seq_number` - the sequence number for the networked command (required)
`:max_age` - the max age of the node info frame give in 2^n minutes
see section on cached minutes below for more information (optional)
`:node_id` - the node id that that node information is being requested for
(required)
## Cached Minutes
This Z-Wave network will cache node information to perverse bandwidth and
provides access to node information about sleeping nodes.
When sending the `NodeInfoCachedGet` command we can specify the max age of
the cached data. If the cached data is older than the `:max_age` param the
Z-Wave network will try to refresh the cache and send back the most updated
information.
The values for the `:max_age` parameter are numbers from 1 to 14. This number
will be 2 ^ number minutes. So if you pass the number `4` the receiving
Z-Wave device will consider that 16 minutes.
Two other options are `:infinite` and `:force_update`. Where `:infinite`
means that the cache will not be freshed regardless of how old the data is
and where `:force_update` means that no matter the age of the cached node
data the cache will attempt to be updated.
We default to `10` which `1024` minutes, or just a little over 1 day. This
default is chosen to limit bandwidth usage. Also, the data found in the
report is fairly static, so there isn't a pressing need to update the cache
to often.
"""
@behaviour Grizzly.ZWave.Command
@type max_age :: 1..14 | :infinite | :force_update
@type param ::
{:seq_number, Grizzly.seq_number()}
| {:node_id, Grizzly.Node.id()}
| {:max_age, max_age()}
alias Grizzly.ZWave.{Command, DecodeError}
alias Grizzly.ZWave.CommandClasses.NetworkManagementProxy
@impl true
@spec new([param]) :: {:ok, Command.t()}
def new(params) do
params = set_defaults(params)
# TODO: validate params
command = %Command{
name: :node_info_cache_get,
command_byte: 0x03,
command_class: NetworkManagementProxy,
params: 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)
max_age = Command.param!(command, :max_age)
node_id = Command.param!(command, :node_id)
<<seq_number, encode_max_age(max_age), node_id>>
end
@impl true
@spec decode_params(binary()) :: {:ok, [param]} | {:error, DecodeError.t()}
def decode_params(params_binary) do
<<seq_number, max_age_byte, node_id>> = params_binary
case decode_max_age(max_age_byte) do
{:ok, max_age} ->
{:ok, [seq_number: seq_number, max_age: max_age, node_id: node_id]}
{:error, %DecodeError{}} = error ->
error
end
end
@spec encode_max_age(max_age()) :: 0..15
def encode_max_age(n) when n > 0 and n < 15, do: n
def encode_max_age(:infinite), do: 15
def encode_max_age(:force_update), do: 0
@spec decode_max_age(byte()) :: {:ok, max_age()} | {:error, DecodeError.t()}
def decode_max_age(0), do: {:ok, :force_update}
def decode_max_age(15), do: {:ok, :infinite}
def decode_max_age(n) when n > 0 and n < 15, do: n
def decode_max_age(n),
do: {:error, %DecodeError{value: n, param: :max_age, command: :node_info_cache_get}}
defp set_defaults(params) do
Keyword.put_new(params, :max_age, 10)
end
end