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/controller.ex
defmodule Grizzly.Controller do
@moduledoc """
This module is for Z-Wave controller level operations.
That mostly having to handle network related calls like
adding/removing a node, geting nodes' IP, listing nodes,
and etc.
"""
use GenServer
require Logger
alias Grizzly
alias Grizzly.{Conn, Notifications}
alias Grizzly.Conn.Config
alias Grizzly.Network.State, as: NetworkState
defmodule State do
@moduledoc false
defstruct conn: nil
end
@spec start_link(Config.t()) :: GenServer.on_start()
def start_link(grizzly) do
GenServer.start_link(__MODULE__, grizzly, name: __MODULE__)
end
@doc """
Check to see if the connection is connected to
the gateway server.
"""
@spec connected?() :: boolean
def connected?() do
GenServer.call(__MODULE__, :connected?)
end
@spec conn() :: Conn.t()
def conn() do
GenServer.call(__MODULE__, :conn)
end
@doc "Get the connection but set to the given mode"
@spec conn(Config.mode()) :: Conn.t()
def conn(mode) do
GenServer.call(__MODULE__, {:conn, mode})
end
@impl true
def init(conn_config) do
_ = Notifications.subscribe(:connection_established)
conn = Conn.open(conn_config)
{:ok, %State{conn: conn}}
end
@impl true
def handle_call(:connected?, _from, %State{conn: conn} = state) when conn in [nil, false] do
{:reply, false, state}
end
def handle_call(:connected?, _from, %State{conn: conn} = state) do
{:reply, Conn.connected?(conn), state}
end
def handle_call(:conn, _from, %State{conn: conn} = state) do
{:reply, conn, state}
end
def handle_call({:conn, mode}, _from, %State{conn: conn} = state) do
{:reply, Conn.override_mode(conn, mode), state}
end
@impl true
def handle_info(
{:connection_established, %Config{ip: ip}},
%State{conn: %Conn{ip_address: ip}} = state
) do
NetworkState.set(:idle)
Notifications.broadcast(:controller_connected)
{:noreply, state}
end
def handle_info(_, state), do: {:noreply, state}
end