Packages
grizzly
8.14.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/door_lock.ex
defmodule Grizzly.ZWave.CommandClasses.DoorLock do
@moduledoc """
DoorLock Command Class
This command class provides commands that are used to operate and configure
door lock devices
"""
@behaviour Grizzly.ZWave.CommandClass
alias Grizzly.ZWave.DecodeError
require Logger
@type mode ::
:unsecured
| :unsecured_with_timeout
| :unsecured_inside_door_handles
| :unsecured_inside_door_handles_with_timeout
| :unsecured_outside_door_handles
| :unsecured_outside_door_handles_with_timeout
| :secured
| :unknown
@type operation_type :: :constant_operation | :timed_operation
@type door_components :: :bolt | :latch | :door
@impl Grizzly.ZWave.CommandClass
def byte(), do: 0x62
@impl Grizzly.ZWave.CommandClass
def name(), do: :door_lock
@spec mode_to_byte(mode()) :: byte()
def mode_to_byte(:unsecured), do: 0x00
def mode_to_byte(:unsecured_with_timeout), do: 0x01
def mode_to_byte(:unsecured_inside_door_handles), do: 0x10
def mode_to_byte(:unsecured_inside_door_handles_with_timeout), do: 0x11
def mode_to_byte(:unsecured_outside_door_handles), do: 0x20
def mode_to_byte(:unsecured_outside_door_handles_with_timeout), do: 0x21
def mode_to_byte(:secured), do: 0xFF
# version >= 4
def mode_to_byte(:unknown), do: 0xFE
@spec mode_from_byte(byte()) :: mode()
def mode_from_byte(0x00), do: :unsecured
def mode_from_byte(0x01), do: :unsecured_with_timeout
def mode_from_byte(0x10), do: :unsecured_inside_door_handles
def mode_from_byte(0x11), do: :unsecured_inside_door_handles_with_timeout
def mode_from_byte(0x20), do: :unsecured_outside_door_handles
def mode_from_byte(0x21), do: :unsecured_outside_door_handles_with_timeout
def mode_from_byte(0xFF), do: :secured
# version >= 4
def mode_from_byte(0xFE), do: :unknown
def mode_from_byte(byte) do
Logger.warning("Unexpected value for door lock mode: #{byte}")
:unknown
end
def operation_type_to_byte(:constant_operation), do: 0x01
def operation_type_to_byte(:timed_operation), do: 0x02
def operation_type_from_byte(0x01), do: {:ok, :constant_operation}
def operation_type_from_byte(0x02), do: {:ok, :timed_operation}
def operation_type_from_byte(byte),
do: {:error, %DecodeError{param: :operation_type, value: byte}}
def door_handles_to_bitmask(handles) do
<<bitmask::4>> =
for handle <- 4..1//-1, into: <<>> do
if handle in handles, do: <<0x01::1>>, else: <<0x00::1>>
end
bitmask
end
def door_handles_from_bitmask(byte) do
bitmask = <<byte::4>>
for(<<x::1 <- bitmask>>, do: x)
|> Enum.reverse()
|> Enum.with_index(1)
|> Enum.reduce([], fn {bit, index}, acc ->
if bit == 1, do: [index | acc], else: acc
end)
end
def to_minutes_and_seconds(seconds) do
{div(seconds, 60), rem(seconds, 60)}
end
end