Packages
grizzly
6.8.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/node.ex
defmodule Grizzly.Node do
@moduledoc """
Functions for working directly with a Z-Wave node
"""
alias Grizzly.{Report, SeqNumber, VirtualDevices, ZWave, ZWave.Command}
alias Grizzly.ZWave.CommandClasses.NetworkManagementInstallationMaintenance, as: NMIM
@type id :: non_neg_integer()
@type lifeline_opts :: {:controller_id, ZWave.node_id()} | {:extra_node_ids, [ZWave.node_id()]}
@typedoc """
Options to use when getting device info.
* `:force_update` - By default there is a cache managed by `zipgateway` that
tracks the device information. Sometimes that can get out of date, so you
can pass `[force_update: true]` to force the cache to update the device
info. By default this is `false`
"""
@type info_opt() :: {:force_update, boolean()} | info_opt()
@type opt() :: {:seq_number, integer()} | {:timeout, non_neg_integer()}
@doc """
Get the information for a node by its id
The response to this command is the `NodeInfoCacheReport` command
"""
@spec get_info(ZWave.node_id() | VirtualDevices.id(), [info_opt() | opt()]) ::
Grizzly.send_command_response()
def get_info(node_id, opts \\ [])
def get_info({:virtual, _} = node_id, opts) do
seq_number = opts[:seq_number] || SeqNumber.get_and_inc()
params = [
seq_number: seq_number,
node_id: node_id
]
Grizzly.send_command(node_id, :node_info_cached_get, params)
end
def get_info(node_id, info_opt) do
seq_number = SeqNumber.get_and_inc()
max_age = info_get_max_age(info_opt)
# we set the timeout to default to 10 seconds because Z-Wave will have to
# do the node interrogation flow again. In cases where using the cache is
# ok, the response is immediate.
send_command_opts =
info_opt
|> Keyword.take([:timeout])
|> Keyword.put_new(:timeout, 10_000)
params = [
seq_number: seq_number,
node_id: node_id,
max_age: max_age
]
Grizzly.send_command(:gateway, :node_info_cached_get, params, send_command_opts)
end
defp info_get_max_age(info_opt) do
if info_opt[:force_update] do
:force_update
else
# if the caller does not want to force a cache update this default
# allowing records up to 32 minutes old. This is calculated at the Z-Wave
# level as 2^5.
5
end
end
@doc """
Get a node's dsk.
The response to this command is the `DSKReport` command
Sending this command with `:gateway` will always go to your Z-Wave controller
"""
@spec get_dsk(ZWave.node_id() | :gateway, :add | :learn, [Grizzly.command_opt()]) ::
Grizzly.send_command_response()
def get_dsk(node_id, add_mode, opts \\ []) do
Grizzly.send_command(
node_id,
:dsk_get,
[add_mode: add_mode, seq_number: SeqNumber.get_and_inc()],
opts
)
end
@doc """
Set lifeline association for the node
The lifeline associated is used to report events that happen at the Z-Wave
device level back to the Z-Wave controller. For example, if you turn on a
light and want to be notified, the device will need to have it's lifeline
association set.
Opts:
* `:controller_id` - the idea of the main controller to send lifeline
reports to (defaults to `1`)
* `:extra_node_ids` - any extra nodes to set add to the association
group
"""
@spec set_lifeline_association(ZWave.node_id() | VirtualDevices.id(), [lifeline_opts()]) ::
Grizzly.send_command_response()
def set_lifeline_association(node_id, opts \\ []) do
controller_id = Keyword.get(opts, :controller_id, 1)
extra_node_ids = Keyword.get(opts, :extra_node_ids, [])
nodes = [controller_id | extra_node_ids]
Grizzly.send_command(node_id, :association_set, grouping_identifier: 0x01, nodes: nodes)
end
@doc """
Get the lifeline association group for a node.
"""
@spec get_lifeline_association(ZWave.node_id() | VirtualDevices.id()) ::
Grizzly.send_command_response()
def get_lifeline_association(node_id) do
Grizzly.send_command(node_id, :association_get, grouping_identifier: 0x01)
end
@doc """
Gets a node's statistics from Z/IP Gateway.
"""
@spec get_statistics(ZWave.node_id() | VirtualDevices.id()) ::
{:ok, NMIM.statistics()} | {:error, any()}
def get_statistics(node_id) do
with {:ok, %Report{command: %Command{} = cmd}} <-
Grizzly.send_command(:gateway, :statistics_get, node_id: node_id),
stats when is_list(stats) <- Command.param(cmd, :statistics) do
{:ok, stats}
else
nil ->
{:error, :unavailable}
{_, %Grizzly.Report{type: :timeout}} ->
{:error, :timeout}
{:error, reason} ->
{:error, reason}
end
end
end