Packages
grizzly
6.8.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/connection.ex
defmodule Grizzly.Connection do
@moduledoc false
require Logger
alias Grizzly.Connections.Supervisor
alias Grizzly.Connections.{AsyncConnection, BinaryConnection, SyncConnection}
alias Grizzly.Report
alias Grizzly.ZWave
alias Grizzly.ZWave.Command
@type mode() :: :sync | :async | :binary
@type opt() :: {:mode, mode()} | {:owner, pid()}
@doc """
Open a connection to a node or the Z/IP Gateway
If the DTLS connection cannot be opened after some time this will return
`{:error, :timeout}`
"""
@spec open(ZWave.node_id() | :gateway, [opt()]) :: {:ok, pid()} | {:error, :timeout}
def open(node_id, opts \\ []) do
Supervisor.start_connection(node_id, opts)
end
@doc """
Close a connection to a Z-Wave node
"""
@spec close(ZWave.node_id()) :: :ok
def close(node_id) do
# only close sync connections because async connections
# are only used during inclusion and are short lived. Also,
# in Grizzly.send_command/4 we wont allow sending anything during
# an inclusion so anything that would want a connection closed would
# not hit this point unless there a bug. So, lets assume that
# this is only valid for sync connections. If this assumption is false
# we should get really active errors that a user can share in a bug
# report to help us identify how the assumption is false and we can
# explore fixing that.
SyncConnection.close(node_id)
end
@doc """
Send a `Grizzly.ZWave.Command` to a Z-Wave device.
"""
@spec send_command(ZWave.node_id(), Command.t(), [Grizzly.command_opt()]) ::
Grizzly.send_command_response()
def send_command(node_id, command, opts \\ []) do
# TODO: the `:type` is deprecated and will be removed in Grizzly 7.0
mode = Keyword.get(opts, :mode, Keyword.get(opts, :type, :sync))
Logger.debug("Sending Cmd (#{inspect(mode)}): #{inspect(command)}")
case mode do
:sync ->
SyncConnection.send_command(node_id, command, opts)
:async ->
# `AsyncConnection.send_command` always returns {:ok, ref}. We'll translate this
# to a `Grizzly.Report` for consistency with `SyncConnection`'s behavior.
{:ok, ref} = AsyncConnection.send_command(node_id, command, opts)
{:ok, Report.new(:inflight, :queued_delay, node_id, command_ref: ref, queued: true)}
end
end
def send_binary(node_id, binary, opts \\ []) do
base = Keyword.get(opts, :format, :hex)
Logger.debug("Sending binary: #{inspect(binary, base: base)}")
BinaryConnection.send_binary(node_id, binary)
end
end