Current section

Files

Jump to
grizzly lib grizzly command_class thermostat_setback get.ex
Raw

lib/grizzly/command_class/thermostat_setback/get.ex

defmodule Grizzly.CommandClass.ThermostatSetback.Get do
@moduledoc """
Command module for working with ThermostatSetback command class GET command
Command Options:
* `:seq_number` - The sequence number for the Z/IP Packet
* `:retries` - The number of times to resend the command (default 2)
"""
@behaviour Grizzly.Command
alias Grizzly.Packet
alias Grizzly.CommandClass.ThermostatSetback
require Logger
@type t :: %__MODULE__{
seq_number: Grizzly.seq_number(),
retries: non_neg_integer()
}
@type opt ::
{:seq_number, Grizzly.seq_number()}
| {:retries, non_neg_integer()}
@type report :: %{
type: ThermostatSetback.setback_type(),
state: ThermostatSetback.setback_state()
}
defstruct seq_number: nil, retries: 2
@spec init([opt]) :: {:ok, t}
def init(opts) do
{:ok, struct(__MODULE__, opts)}
end
@spec encode(t) :: {:ok, binary}
def encode(%__MODULE__{seq_number: seq_number}) do
binary = Packet.header(seq_number) <> <<0x47, 0x02>>
{:ok, binary}
end
@spec handle_response(t, Packet.t()) ::
{:continue, t}
| {:done, {:error, :nack_response}}
| {:done, report()}
| {:retry, t}
def handle_response(
%__MODULE__{seq_number: seq_number} = command,
%Packet{
seq_number: seq_number,
types: [:ack_response]
}
) do
{:continue, command}
end
def handle_response(
%__MODULE__{seq_number: seq_number, retries: 0},
%Packet{
seq_number: seq_number,
types: [:nack_response]
}
) do
{:done, {:error, :nack_response}}
end
def handle_response(
%__MODULE__{seq_number: seq_number, retries: n} = command,
%Packet{
seq_number: seq_number,
types: [:nack_response]
}
) do
{:retry, %{command | retries: n - 1}}
end
def handle_response(
_,
%Packet{
body: %{
command: :report,
report: %{type: _setback_type, state: _setback_state} = report,
command_class: :thermostat_setback
}
}
) do
{:done, {:ok, report}}
end
def handle_response(command, _response) do
{:continue, command}
end
end