Packages
grizzly
0.6.1
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/network.ex
defmodule Grizzly.Network do
@moduledoc """
Module for working with the Z-Wave network
"""
require Logger
alias Grizzly.{Node, SeqNumber, Controller}
alias Grizzly.Network.State, as: NetworkState
alias Grizzly.CommandClass.NetworkManagementProxy.{
NodeListGet,
NodeInfoCache
}
alias Grizzly.CommandClass.NetworkManagementBasic.DefaultSet
@doc """
Reset the network
"""
@spec reset() :: :ok | {:error, :network_busy}
def reset() do
seq_number = SeqNumber.get_and_inc()
Grizzly.send_command(
Controller.conn(),
DefaultSet,
seq_number: seq_number
)
end
@doc """
Check to see if the network is busy
"""
@spec busy?() :: boolean()
def busy?() do
NetworkState.busy?()
end
@doc """
Check to see if the network is ready
"""
@spec ready?() :: boolean()
def ready?() do
NetworkState.ready?()
end
@doc """
Get the current state of the Network
"""
@spec get_state() :: NetworkState.state()
def get_state() do
NetworkState.get()
end
@doc """
Set the Z-Wave network state
"""
@spec set_state(NetworkState.state()) :: :ok
def set_state(state) do
NetworkState.set(state)
end
@doc """
Get a list of nodes from the network
"""
@spec get_nodes() :: {:ok, [Node.t()]} | {:error, :unable_to_get_node_list}
def get_nodes() do
seq_number = SeqNumber.get_and_inc()
node_list =
Grizzly.send_command(
Controller.conn(),
NodeListGet,
seq_number: seq_number
)
case node_list do
{:ok, node_list} ->
nodes =
node_list
|> Enum.filter(&(&1 != 1))
|> Enum.map(fn node_id ->
case get_node(node_id) do
{:ok, zw_node} ->
zw_node
{:error, reason} ->
_ = Logger.warn("Error getting node info for #{node_id} reason: #{reason}")
Node.new(id: node_id)
end
end)
{:ok, nodes}
{:error, _} ->
{:error, :unable_to_get_node_list}
end
end
@doc """
Get a Node from the Z-Wave network
"""
@spec get_node(Node.node_id()) :: {:ok, Node.t()} | {:error, :nack_response}
def get_node(node_id) do
with {:ok, node_info} <- get_node_info(node_id),
{:ok, ip_address} <- Node.get_ip(node_id) do
zw_node =
node_info
|> Map.put(:id, node_id)
|> Map.put(:ip_address, ip_address)
|> Map.to_list()
|> Node.new()
{:ok, zw_node}
else
{:error, _} = error ->
error
end
end
@spec get_node_info(Node.node_id()) :: {:ok, map()} | {:error, :nack_response}
def get_node_info(node_id) do
seq_number = SeqNumber.get_and_inc()
Grizzly.send_command(
Controller.conn(),
NodeInfoCache,
cached_minutes_passed: 0x01,
node_id: node_id,
seq_number: seq_number
)
end
end