Packages
grizzly
0.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/application.ex
defmodule Grizzly.Application do
@moduledoc false
use Application
require Logger
alias Grizzly.ZipgatewayCfg
def start(_type, _args) do
children =
[
Grizzly.Notifications,
{Grizzly.SeqNumber, Enum.random(0..255)},
{DynamicSupervisor, name: Grizzly.Conn.Supervisor, strategy: :one_for_one},
{Grizzly.UnsolicitedServer, unsolicited_server_config()},
{Grizzly.Controller, get_grizzly_config()},
Grizzly.UnsolicitedServer.Socket.Supervisor,
Grizzly.Inclusion,
Grizzly.Network.State
]
|> maybe_append_muontrap()
opts = [strategy: :one_for_one, name: Grizzly.Supervisor]
Supervisor.start_link(children, opts)
end
defp unsolicited_server_config() do
Grizzly.UnsolicitedServer.Config.new(
ip_version: :inet6,
ip_address: {0xFD00, 0xAAAA, 0, 0, 0, 0, 0, 0x0002}
)
end
defp maybe_append_muontrap(children_list) do
with :ok <- get_run_zipgateway_bin(),
{:ok, serial_port} <- get_serial_port(),
{:ok, zipgateway_cfg_path} <- build_zipgateway_cfg() do
priv_dir = :code.priv_dir(:grizzly) |> to_string()
_ = check_for_tuntap(:os.type())
zip_gateway_path = find_zip_gateway()
[
{MuonTrap.Daemon,
[
zip_gateway_path,
["-c", zipgateway_cfg_path, "-s", serial_port],
[cd: priv_dir, log_output: :debug]
]}
] ++ children_list
else
{:error, :no_serial_port} ->
_ =
Logger.error("""
No serial port configured for Grizzly. Add :serial_port to the
config options in your config.exs file like. For example:
config :grizzly,
serial_port: "/dev/ttyACM0"
If you have questions about which serial port(s) your hardware
supports either see the documentation about the nerves system at
https://github.com/nerves-project or ask in the #nerves channel
in the Elixir lang slack.
""")
children_list
:no_run_zipgateway_bin ->
children_list
end
end
defp check_for_tuntap({:unix, :darwin}) do
System.cmd("kextstat", ["-b", "net.sf.tuntaposx.tap"])
|> elem(0)
|> String.contains?("net.sf.tuntaposx.tap")
|> case(
# all OK
do:
(
true ->
nil
_ ->
msg = """
The kernel extension tuntab does not appear to be loaded. You
can install it using `brew cask install tuntap`.
"""
_ = Logger.error(msg)
raise(msg)
)
)
end
defp check_for_tuntap({:unix, _}) do
_unused = System.cmd("modprobe", ["tun"])
end
defp find_zip_gateway do
path = Application.get_env(:grizzly, :zipgateway_path, "/usr/sbin/zipgateway")
case File.stat(path) do
{:error, _posix} ->
msg = """
Cannot find the zipgateway executable (looked for it at #{inspect(path)}.
If it is located somewhere else, please update the config:
config :grizzly,
zipgateway_path: "«path»"
"""
_ = Logger.error(msg)
raise(msg)
{:ok, _stat} ->
# could check the mode, but not really worth it
path
end
end
defp get_serial_port() do
case Application.get_env(:grizzly, :serial_port, {:error, :no_serial_port}) do
{:error, _} = error -> error
serial_port -> {:ok, serial_port}
end
end
defp get_run_zipgateway_bin() do
case Application.get_env(:grizzly, :run_zipgateway_bin, true) do
true -> :ok
false -> :no_run_zipgateway_bin
end
end
defp get_grizzly_config() do
case Application.get_env(:grizzly, Grizzly.Controller) do
nil -> Grizzly.config()
opts -> Grizzly.Conn.Config.new(opts)
end
end
defp build_zipgateway_cfg() do
cfg_opts = Application.get_env(:grizzly, :zipgateway_cfg, %{})
ZipgatewayCfg.new(cfg_opts)
|> ZipgatewayCfg.write()
end
end