Packages
grizzly
0.8.7
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_class/schedule_entry_lock/daily_repeating_set.ex
defmodule Grizzly.CommandClass.ScheduleEntryLock.DailyRepeatingSet do
@moduledoc """
Command for working with SCHEDULE_ENTRY_LOCK command class DAILY_REPEATING_SET command
Command Options:
* `:user_id` - a number for the user id
* `:slot_id` - the slot id for the code
* `:action` - `:enable` or `:disable` the action
* `:weekdays` - List of weekdays to run schedule on
* `:start_hour` - The hour of the day to start
* `:start_minute` - The minute of the hour to start
* `:duration_hour` - The amount of hours to keep the schedule available
* `:duration_minute` - The number of minutes within the hour to keep the schedule available
* `:seq_number` - The sequence number used in the Z/IP packet
* `:retries` - The number of attempts to send the command (default 2)
"""
@behaviour Grizzly.Command
alias Grizzly.Packet
alias Grizzly.Command.{EncodeError, Encoding}
alias Grizzly.CommandClass.ScheduleEntryLock
@type t :: %__MODULE__{
seq_number: Grizzly.seq_number(),
retries: non_neg_integer(),
user_id: non_neg_integer(),
slot_id: non_neg_integer(),
action: ScheduleEntryLock.enable_action(),
weekdays: ScheduleEntryLock.weekdays(),
start_hour: non_neg_integer(),
start_minute: non_neg_integer(),
duration_hour: non_neg_integer(),
duration_minute: non_neg_integer()
}
@type opt ::
{:seq_number, Grizzly.seq_number()}
| {:retries, non_neg_integer()}
| {:user_id, non_neg_integer()}
| {:slot_id, non_neg_integer()}
| {:action, ScheduleEntryLock.enable_action()}
| {:weekdays, ScheduleEntryLock.weekdays()}
| {:start_hour, non_neg_integer()}
| {:start_minute, non_neg_integer()}
| {:duration_hour, non_neg_integer()}
| {:duration_minute, non_neg_integer()}
defstruct seq_number: nil,
retries: 2,
user_id: nil,
slot_id: nil,
action: nil,
weekdays: [],
start_hour: nil,
start_minute: nil,
duration_hour: nil,
duration_minute: nil
@spec init([opt]) :: {:ok, t}
def init(opts) do
{:ok, struct(__MODULE__, opts)}
end
@spec encode(t) :: {:ok, binary} | {:error, EncodeError.t()}
def encode(
%__MODULE__{
user_id: user_id,
slot_id: slot_id,
action: _action,
weekdays: _weekdays,
start_hour: start_hour,
start_minute: start_minute,
duration_hour: duration_hour,
duration_minute: duration_minute,
seq_number: seq_number
} = command
) do
with {:ok, encoded} <-
Encoding.encode_and_validate_args(command, %{
weekdays: {:encode_with, ScheduleEntryLock, :encode_weekdays},
action: {:encode_with, ScheduleEntryLock, :encode_enable_action},
user_id: :byte,
slot_id: :byte,
start_hour: {:range, 0, 23},
start_minute: {:range, 0, 59},
duration_hour: {:range, 0, 23},
duration_minute: {:range, 0, 59}
}) do
binary =
Packet.header(seq_number) <>
<<
0x4E,
0x10,
encoded.action::size(8),
user_id,
slot_id,
encoded.weekdays::binary(),
start_hour,
start_minute,
duration_hour,
duration_minute
>>
{:ok, binary}
end
end
@spec handle_response(t, Packet.t()) ::
{:continue, t}
| {:done, {:error, :nack_response}}
| {:done, :ok}
| {:retry, t}
def handle_response(
%__MODULE__{seq_number: seq_number} = _command,
%Packet{
seq_number: seq_number,
types: [:ack_response]
}
) do
{:done, :ok}
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_class: :schedule_entry_lock,
command: :daily_repeating_report,
value: report
}
}
) do
{:done, {:ok, report}}
end
def handle_response(
%__MODULE__{seq_number: seq_number} = command,
%Packet{
seq_number: seq_number,
types: [:nack_response, :nack_waiting]
} = packet
) do
if Packet.sleeping_delay?(packet) do
{:queued, command}
else
{:continue, command}
end
end
def handle_response(command, _), do: {:continue, command}
end