Packages
grizzly
6.8.6
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/barrier_operator.ex
defmodule Grizzly.ZWave.CommandClasses.BarrierOperator do
@moduledoc """
"BarrierOperator" Command Class
The Barrier Operator Command Class is used to control and query the status of motorized barriers.
"""
@behaviour Grizzly.ZWave.CommandClass
alias Grizzly.ZWave.DecodeError
import Bitwise
@type target_value :: :open | :close
@type state :: :closed | 0x01..0x63 | :closing | :stopped | :opening | :open
@type subsystem_type :: :audible_notification | :visual_notification
@type subsystem_state :: :on | :off
@impl Grizzly.ZWave.CommandClass
def byte(), do: 0x66
@impl Grizzly.ZWave.CommandClass
def name(), do: :barrier_operator
@spec target_value_to_byte(:close | :open) :: 0x00 | 0xFF
def target_value_to_byte(:close), do: 0x00
def target_value_to_byte(:open), do: 0xFF
@spec target_value_from_byte(byte) ::
{:error, Grizzly.ZWave.DecodeError.t()} | {:ok, :close | :open}
def target_value_from_byte(0x00), do: {:ok, :close}
def target_value_from_byte(0xFF), do: {:ok, :open}
def target_value_from_byte(byte), do: {:error, %DecodeError{value: byte, param: :target_value}}
@spec state_to_byte(state) :: byte
def state_to_byte(:closed), do: 0x00
def state_to_byte(:closing), do: 0xFC
def state_to_byte(:stopped), do: 0xFD
def state_to_byte(:opening), do: 0xFE
def state_to_byte(:open), do: 0xFF
def state_to_byte(stopped_position) when stopped_position in 0x01..0x63, do: stopped_position
@spec state_from_byte(byte) ::
{:error, Grizzly.ZWave.DecodeError.t()}
| {:ok, state}
def state_from_byte(0x00), do: {:ok, :closed}
def state_from_byte(0xFC), do: {:ok, :closing}
def state_from_byte(0xFD), do: {:ok, :stopped}
def state_from_byte(0xFE), do: {:ok, :opening}
def state_from_byte(0xFF), do: {:ok, :open}
def state_from_byte(byte) when byte in 0x01..0x63, do: {:ok, byte}
def state_from_byte(byte), do: {:error, %DecodeError{value: byte, param: :state}}
@doc "Converts subsystems into a bytes"
@spec subsystem_types_to_bitmask([subsystem_type]) :: byte
def subsystem_types_to_bitmask(subsystem_types) do
subsystem_type_bytes =
for subsystem_type <- subsystem_types, do: subsystem_type_to_byte(subsystem_type)
integer = Enum.reduce(subsystem_type_bytes, 0x00, fn byte, acc -> acc ||| byte end)
<<byte>> = <<integer>>
byte
end
def bitmask_to_subsystem_types(byte) do
bitmask = <<byte>>
bits_on =
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)
Enum.reduce(bits_on, [], fn bit_on, acc ->
case subsystem_type_from_byte(bit_on) do
{:ok, subsystem_type} -> [subsystem_type | acc]
_other -> acc
end
end)
end
@spec subsystem_type_to_byte(:audible_notification | :visual_notification) :: 0x01 | 0x02
def subsystem_type_to_byte(:audible_notification), do: 0x01
def subsystem_type_to_byte(:visual_notification), do: 0x02
@spec subsystem_type_from_byte(any) ::
{:error, Grizzly.ZWave.DecodeError.t()}
| {:ok, subsystem_type}
def subsystem_type_from_byte(0x01), do: {:ok, :audible_notification}
def subsystem_type_from_byte(0x02), do: {:ok, :visual_notification}
def subsystem_type_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :subsystem_type}}
@spec subsystem_state_to_byte(:off | :on) :: 0x00 | 0xFF
def subsystem_state_to_byte(:off), do: 0x00
def subsystem_state_to_byte(:on), do: 0xFF
@spec subsystem_state_from_byte(byte) ::
{:error, Grizzly.ZWave.DecodeError.t()} | {:ok, subsystem_state}
def subsystem_state_from_byte(0x00), do: {:ok, :off}
def subsystem_state_from_byte(0xFF), do: {:ok, :on}
def subsystem_state_from_byte(byte),
do: {:error, %DecodeError{value: byte, param: :subsystem_state}}
end