Packages
grizzly
7.2.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/command_handlers/supervision_report.ex
defmodule Grizzly.CommandHandlers.SupervisionReport do
@moduledoc """
This handler is used for non-get commands sent with Supervision.
"""
@behaviour Grizzly.CommandHandler
alias Grizzly.Report
alias Grizzly.ZWave.Command
@impl Grizzly.CommandHandler
def init(opts) do
state =
opts
|> Enum.into(%{})
|> Map.take([:command_ref, :node_id, :session_id, :waiter, :status_updates?])
{:ok, state}
end
@impl Grizzly.CommandHandler
def handle_ack(state), do: {:continue, state}
@impl Grizzly.CommandHandler
def handle_command(%Command{name: :supervision_report} = command, state) do
session_id = Command.param!(command, :session_id)
status = Command.param!(command, :status)
more_status_updates = Command.param!(command, :more_status_updates)
cond do
# ignore this report if the session ids do not match
session_id != state.session_id ->
{:continue, state}
# some devices erroneously set the more_status_updates field to true,
# so we'll consider success, fail, and no_support to be the final report
# even if more_status_updates is true
status in [:success, :fail, :no_support] or more_status_updates == :last_report ->
{:complete, command}
# more reports are coming
true ->
maybe_notify_waiter(command, state)
{:continue, state}
end
end
def handle_command(_command, state), do: {:continue, state}
defp maybe_notify_waiter(command, %{waiter: {waiter_pid, _}, status_updates?: true} = state)
when is_pid(waiter_pid) do
send(
waiter_pid,
{:grizzly, :report,
Report.new(:inflight, :supervision_status, state.node_id,
command: command,
command_ref: state.command_ref
)}
)
end
defp maybe_notify_waiter(_, _), do: :ok
end