Packages
grizzly
7.1.2
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/unsolicited_server/messages.ex
defmodule Grizzly.UnsolicitedServer.Messages do
@moduledoc false
require Logger
alias Grizzly.{Report, VirtualDevices, ZIPGateway}
alias Grizzly.ZWave.Command
@registry __MODULE__.Registry
def child_spec(_) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, []},
type: :worker,
restart: :permanent,
shutdown: 500
}
end
def start_link() do
Registry.start_link(keys: :duplicate, name: @registry)
end
@spec subscribe(Grizzly.command()) :: :ok
def subscribe(event) do
_ = Registry.register(@registry, event, [])
:ok
end
@spec unsubscribe(Grizzly.command()) :: :ok
def unsubscribe(command_name) do
Registry.unregister(@registry, command_name)
end
@spec subscribe_node(Grizzly.node_id() | VirtualDevices.id()) :: :ok
def subscribe_node(node_id) do
_ = Registry.register(@registry, node_id, [])
:ok
end
@spec unsubscribe_node(Grizzly.node_id() | VirtualDevices.id()) :: :ok
def unsubscribe_node(node_id) do
Registry.unregister(@registry, node_id)
end
@spec broadcast(:inet.ip_address() | VirtualDevices.id(), Command.t()) :: :ok
def broadcast({:virtual, _id} = id, command) do
do_broadcast(id, command)
end
def broadcast(node_ip_address, zip_packet_or_command) do
node_id = ZIPGateway.node_id_from_ip(node_ip_address)
command =
case zip_packet_or_command.name do
:zip_packet ->
Command.param!(zip_packet_or_command, :command)
_name ->
zip_packet_or_command
end
do_broadcast(node_id, command)
end
def do_broadcast(node_id, command) do
Logger.debug(
"[GRIZZLY] Unsolicited Message for node #{inspect(node_id)}: #{inspect(command)}"
)
report = Report.new(:complete, :unsolicited, node_id, command: command)
Registry.dispatch(@registry, command.name, fn listeners ->
for {pid, _} <- listeners,
do: send(pid, {:grizzly, :report, report})
end)
Registry.dispatch(@registry, node_id, fn listeners ->
for {pid, _} <- listeners,
do: send(pid, {:grizzly, :report, report})
end)
end
end