Packages
grizzly
8.11.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/zwave/command_classes/user_code.ex
defmodule Grizzly.ZWave.CommandClasses.UserCode do
@moduledoc """
Command Class for working with user codes
"""
@behaviour Grizzly.ZWave.CommandClass
@type user_id_status ::
:available
| :occupied
| :disabled
| :messaging
| :passage
| :status_not_available
| :unknown
| byte()
@type extended_user_id :: 0x0000..0xFFFF
@type extended_user_code :: %{
required(:user_id) => extended_user_code(),
required(:user_id_status) => user_id_status(),
required(:user_code) => String.t()
}
@type keypad_mode :: :normal | :vacation | :privacy | :lockout | :unknown
@impl Grizzly.ZWave.CommandClass
def byte(), do: 0x63
@impl Grizzly.ZWave.CommandClass
def name(), do: :user_code
@spec user_id_status_to_byte(user_id_status()) :: byte()
def user_id_status_to_byte(:available), do: 0x00
def user_id_status_to_byte(:occupied), do: 0x01
def user_id_status_to_byte(:disabled), do: 0x02
def user_id_status_to_byte(:messaging), do: 0x03
def user_id_status_to_byte(:passage), do: 0x04
def user_id_status_to_byte(:status_not_available), do: 0xFE
def user_id_status_to_byte(v) when v in 0..255, do: v
@spec user_id_status_from_byte(byte()) :: user_id_status()
def user_id_status_from_byte(0x00), do: :available
def user_id_status_from_byte(0x01), do: :occupied
def user_id_status_from_byte(0x02), do: :disabled
def user_id_status_from_byte(0x03), do: :messaging
def user_id_status_from_byte(0x04), do: :passage
def user_id_status_from_byte(0xFE), do: :status_not_available
def user_id_status_from_byte(v), do: v
@spec keypad_mode_from_byte(byte()) :: keypad_mode()
def keypad_mode_from_byte(0x00), do: :normal
def keypad_mode_from_byte(0x01), do: :vacation
def keypad_mode_from_byte(0x02), do: :privacy
def keypad_mode_from_byte(0x03), do: :lockout
def keypad_mode_from_byte(_), do: :unknown
@spec keypad_mode_to_byte(keypad_mode()) :: 0 | 1 | 2 | 3
def keypad_mode_to_byte(:normal), do: 0x00
def keypad_mode_to_byte(:vacation), do: 0x01
def keypad_mode_to_byte(:privacy), do: 0x02
def keypad_mode_to_byte(:lockout), do: 0x03
def encode_extended_user_code(user_code) do
user_id = user_code[:user_id]
user_id_status = user_code[:user_id_status]
user_code = user_code[:user_code]
<<user_id::16, user_id_status_to_byte(user_id_status), 0::4, byte_size(user_code)::4,
user_code::binary>>
end
@spec decode_extended_user_codes(binary()) ::
{user_codes :: [extended_user_code()], remainder :: binary()}
def decode_extended_user_codes(user_codes_bin) do
{codes, rest} = do_decode_extended_user_codes([], user_codes_bin)
{Enum.reverse(codes), rest}
end
defp do_decode_extended_user_codes(
codes,
<<user_id::16, user_id_status::8, _reserved::4, code_length::4,
user_code::binary-size(code_length), rest::binary>>
) do
user_code = %{
user_id: user_id,
user_id_status: user_id_status_from_byte(user_id_status),
user_code: user_code
}
do_decode_extended_user_codes([user_code | codes], rest)
end
defp do_decode_extended_user_codes(codes, <<_next_user_id::16>> = rest), do: {codes, rest}
defp do_decode_extended_user_codes(codes, <<>>), do: {codes, <<>>}
end