Packages
grizzly
0.6.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_class/time/offset_set.ex
defmodule Grizzly.CommandClass.Time.OffsetSet do
@moduledoc """
Command module for working with TIME OFFSET_SET command.
command options:
* `:sign_tzo` - This field is used to indicate the sign (plus or minus)
to apply to the Hour TZO and Minute TZO field
* `:hour_tzo` - This field is used to indicate the number of hours that
the originating time zone deviates from UTC
* `:minute_tzo` - This field is used to indicate the number of minutes
that the originating time zone deviates UTC
* `:sign_offset_dst` - This field is used to indicate the sign (plus or minus)
for the Minute Offset DST field to apply to the current time while in the
Daylight Saving Time
* `:minute_offset_dst` - This field MUST indicate the number of minutes by which
the current time is to be adjusted when Daylight Saving Time starts
* `:month_start_dst` - This field MUST indicate the month of the year when Daylight
Saving Time starts
* `:day_end_dst` - This field MUST indicate the day of the month when Daylight Saving
Time starts
* `:hour_start_dst` - This field MUST indicate the hour of the day when Daylight
Saving Time starts
* `:month_end_dst` - This field MUST indicate the month of the year when Daylight
Saving Time ends
* `:day_end_dst` - This field MUST indicate the day of the month when Daylight Saving
Time ends
* `:seq_number` - The sequence number for the Z/IP Packet
* `:retries` - The number times to retry to send the command (default 2)
"""
@behaviour Grizzly.Command
alias Grizzly.Packet
alias Grizzly.Command.{EncodeError, Encoding}
alias Grizzly.CommandClass.Time
@type t :: %__MODULE__{
seq_number: Grizzly.seq_number(),
retries: non_neg_integer(),
value: Time.offset()
}
@type opt ::
{:seq_number, Grizzly.seq_number()}
| {:retries, non_neg_integer()}
| {:value, Time.offset()}
defstruct seq_number: nil, retries: 2, value: 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__{
value: %{
sign_tzo: sign_tzo,
# deviation from UTC
hour_tzo: hour_tzo,
minute_tzo: minute_tzo,
sign_offset_dst: sign_offset_dst,
minute_offset_dst: minute_offset_dst,
# start of DST
month_start_dst: month_start_dst,
day_start_dst: day_start_dst,
# end of DST
hour_start_dst: hour_start_dst,
month_end_dst: month_end_dst,
day_end_dst: day_end_dst,
hour_end_dst: hour_end_dst
},
seq_number: seq_number
} = command
) do
with {:ok, _encoded} <-
Encoding.encode_and_validate_args(
command,
%{
sign_tzo: :bit,
hour_tzo: {:range, 0, 14},
minute_tzo: {:range, 0, 59},
sign_offset_dst: :bit,
minute_offset_dst: {:range, 0, 59},
month_start_dst: {:range, 1, 12},
day_start_dst: {:range, 1, 31},
hour_start_dst: {:range, 0, 59},
month_end_dst: {:range, 1, 12},
day_end_dst: {:range, 1, 31},
hour_end_dst: {:range, 0, 59}
},
[:value]
) do
binary =
Packet.header(seq_number) <>
<<
0x8A,
0x05,
sign_tzo::size(1),
hour_tzo::size(7),
minute_tzo,
sign_offset_dst::size(1),
minute_offset_dst::size(7),
month_start_dst,
day_start_dst,
hour_start_dst,
month_end_dst,
day_end_dst,
hour_end_dst
>>
{:ok, binary}
end
end
@spec handle_response(t, Packet.t()) ::
{:continue, t}
| {:done, {:error, :nack_response}}
| {:done, Time.offset()}
| {: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: :time,
command: :time_offset_report,
value: value
}
}
) do
{:done, {:ok, value}}
end
def handle_response(command, _), do: {:continue, command}
end