Packages
grizzly
8.15.3
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/connections/binary_connection.ex
defmodule Grizzly.Connections.BinaryConnection do
@moduledoc false
# A special connection that only handles send and receiving binary data
# This connection works when using `Grizzly.send_binary/2` by using the
# the calling process as part of the GenServer name to ensure that many
# calling sites can send these commands to the same node id with getting
# each other's messages.
# As of right now this connection won't use keep alive and will close it self
# after 25 seconds of inactivity. For the known use cases for this connection
# the behavior is ideal. Namely debugging and quick one off commands like when
# another device asks us something about our device.
use GenServer
require Logger
alias Grizzly.{Connections, Options, Transport, ZIPGateway, ZWave}
defmodule State do
@moduledoc false
@enforce_keys [:transport, :owner, :node_id]
defstruct transport: nil, owner: nil, node_id: nil
end
def child_spec(node_id, opts) do
%{id: __MODULE__, start: {__MODULE__, :start_link, [node_id, opts]}, restart: :transient}
end
@doc """
Start the BinaryConnection
"""
@spec start_link(Options.t(), ZWave.node_id(), keyword()) :: GenServer.on_start()
def start_link(grizzly_options, node_id, opts) do
owner = Keyword.fetch!(opts, :owner)
name = Connections.make_name({:binary, node_id, owner})
GenServer.start_link(__MODULE__, [grizzly_options, node_id, owner], name: name)
end
@doc """
Send a binary packet to the Z-Wave node
"""
@spec send_binary(ZWave.node_id(), binary()) :: :ok
def send_binary(node_id, binary) do
name = Connections.make_name({:binary, node_id, self()})
GenServer.call(name, {:send_binary, binary})
end
@impl GenServer
def init([grizzly_options, node_id, owner]) do
host = ZIPGateway.host_for_node(node_id, grizzly_options)
transport_impl = grizzly_options.transport
transport_opts = [
ip_address: host,
port: grizzly_options.zipgateway_port,
node_id: node_id
]
case Transport.open(transport_impl, transport_opts) do
{:ok, transport} ->
{:ok,
%State{
transport: transport,
owner: owner,
node_id: node_id
}}
{:error, :timeout} ->
{:stop, :timeout}
end
end
@impl GenServer
def handle_call({:send_binary, binary}, _from, state) do
%State{transport: transport} = state
Transport.send(transport, binary)
{:reply, :ok, state}
end
@impl GenServer
def handle_info(data, state) do
%State{transport: transport, owner: owner, node_id: node_id} = state
case Transport.parse_response(transport, data, raw: true) do
{:ok, :connection_closed} ->
Logger.debug("[Grizzly] connection to node #{inspect(node_id)} closed")
{:stop, :normal, state}
{:ok, binary} ->
send(owner, {:grizzly, :binary_response, binary})
{:noreply, state}
end
end
end